0

我正在使用 Spring Data JPA 和实体图。我有以下实体结构: Result实体有一个实体列表,SingleQuestionResponse实体SingleQuestionResponse有一组Answer实体(markedAnswers)。

public class Result {
...

 @OneToMany(cascade = CascadeType.PERSIST)
 @JoinColumn(name = "result_id", nullable = false)
 private List<SingleQuestionResponse> responses;

...

}
public class SingleQuestionResponse {
...

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
        name = "singlequestionresponses_answers",
        joinColumns = @JoinColumn(name = "single_question_response_id"),
        inverseJoinColumns = @JoinColumn(name = "answer_id")
)
private Set<Answer> markedAnswers;

...
}

并且Answer只有简单类型的字段。

现在,我希望能够在一个查询中获取结果以及所有响应和标记的答案。为此,我在Result课堂上注释了:

@NamedEntityGraph(name = "graph.Result.responsesWithQuestionsAndAnswersEager",
        attributeNodes = @NamedAttributeNode(value = "responses", subgraph = "responsesWithMarkedAnswersAndQuestion"),
        subgraphs = {
                @NamedSubgraph(name = "responsesWithMarkedAnswersAndQuestion", attributeNodes = {
                        @NamedAttributeNode("markedAnswers"),
                        @NamedAttributeNode("question")
                })
        }
)

一个使用示例是:

@EntityGraph("graph.Result.responsesWithQuestionsAndAnswersEager")
List<Result> findResultsByResultSetId(Long resultSetId);

我注意到,调用该findResultsByResultSetId方法(以及使用此实体图的其他方法)会导致responses( SingleQuestionResponseentities) 乘以markedAnswers. 我的意思是result.getResponses()返回的SingleQuestionResponse对象比它应该返回的对象多(它为每个标记的答案返回一个响应对象)。

我意识到这是由于 Hibernate 使用连接制作了笛卡尔积,但我不知道如何解决它。

你能帮忙吗?谢谢

4

1 回答 1

0

您必须使用DISTINCT运算符。使用 Spring Data JPA,这可以通过命名方法来完成findDistinctResultsByResultSetId

于 2021-06-14T12:41:14.163 回答