【发布时间】:2021-06-09 18:22:24
【问题描述】:
我正在使用 Spring Data JPA 和实体图。
我有以下实体结构:
Result 实体有一个SingleQuestionResponse 实体列表,SingleQuestionResponse 实体有一组Answer 实体(标记答案)。
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 实体)乘以markedAnswers 的数量。我的意思是result.getResponses() 返回的SingleQuestionResponse 对象比它应该返回的对象多(每个标记的答案返回一个响应对象)。
我意识到这是由于 Hibernate 使用连接生成笛卡尔积,但我不知道如何解决它。
你能帮忙吗?谢谢
【问题讨论】:
标签: sql hibernate join spring-data-jpa entitygraph