我正在开发一个问答式的Web应用程序,其中两个实体是问与答。一个问题有很多答案。此外,“答案”有很多答案(我将其称为“答案”的子答案):
@Entity
@Table(name = "questions")
public class Question implements Serializable {
@Id
private Long id;
@OneToMany(mappedBy = "question")
private Set<Answer> answers;
//...
}
@Entity
@Table(name = "answers")
public class Answer implements Serializable {
@Id
private Long id;
@ManyToOne
private Question question;
@ManyToOne
private Answer parentAnswer;
@OneToMany(mappedBy = "parentAnswer")
private Set<Answer> childAnswers;
//...
}
在获取特定答案的子答案时,Hibernate使用类似于以下的查询:
select ... from answers childanswe0_ where childanswe0_.parent_answer_id=?
我想做的是自定义WHERE子句,以便还包括问题ID。我想要这样的东西:
select ... from answers childanswe0_ where
childanswe0_.question_id=? and childanswe0_.parent_answer_id=?
原因是我对要使用的答案(question_id,parent_answer_id)有一个索引。我目前没有,也不想添加答案的索引(parent_answer_id),因此当前查询会导致全表扫描。
我尝试在@JoinColumns
字段上使用childAnswers
,但这会导致错误:org.hibernate.AnnotationException:标记为mappingBy的关联不得定义@JoinTable或@JoinColumn等数据库映射:test .domain.Answer.childAnswers
我也尝试在@JoinColumns
字段上使用parentAnswer
,但这导致错误:org.hibernate.AnnotationException:引用test.domain.Answer的外键来自test.domain.Answer列数错误。应该是1
我的JPA提供程序是Hibernate 5.2.17。
如何确保用于选择父答案的子答案的查询的WHERE子句包含父答案的问题ID?