我正在使用 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
( SingleQuestionResponse
entities) 乘以markedAnswers
. 我的意思是result.getResponses()
返回的SingleQuestionResponse
对象比它应该返回的对象多(它为每个标记的答案返回一个响应对象)。
我意识到这是由于 Hibernate 使用连接制作了笛卡尔积,但我不知道如何解决它。
你能帮忙吗?谢谢