如何自定义用于获取一对多关系的“许多”相关实体的查询?

时间:2018-07-12 19:38:57

标签: java jpa one-to-many hibernate-annotations jpa-annotations

我正在开发一个问答式的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?

0 个答案:

没有答案