当前位置: 首页 > 知识库问答 >
问题:

JPA-将jpql联接查询转换为条件api

韦欣德
2023-03-14

我试图转换这个JPQL查询;

SELECT s FROM QuestionSet s JOIN s.questions q WHERE q.appointedRepetition.date  < :tomorrow
    DateTime tomorrow = DateTime.now().plusDays(1).withTime(0,0,0,0);

    CriteriaBuilder criteriaBuilder = JPA.em().getCriteriaBuilder();
    CriteriaQuery<QuestionSet> query = criteriaBuilder.createQuery(QuestionSet.class);
    Root<QuestionSet> root = query.from(QuestionSet.class);
    Join<QuestionSet, Question> questionJoin = root.join("questions");
    Predicate ownerCondition = criteriaBuilder.equal(root.get("owner"), owner);
    Predicate dateCondition = criteriaBuilder.lessThan(questionJoin.<DateTime>get("appointedRepetition.date"), tomorrow);

    query.where(criteriaBuilder.and(ownerCondition, dateCondition));


    List<QuestionSet> result = JPA.em().createQuery(query).getResultList();

    return result;
play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: Unable to resolve attribute [appointedRepetition.date] against path [null]]]
@Entity
@SequenceGenerator(name = "wordlist_seq", sequenceName = "wordlist_seq")
public class QuestionSet {
  @OneToMany(cascade = CascadeType.ALL)
  private List<Question> questions;
      ...
}


@Entity
@SequenceGenerator(name = "question_seq", sequenceName = "question_seq")
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Question{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_seq")
    private Long id;
        ...
}


    @OneToOne(cascade = CascadeType.ALL)
    private AppointedRepetition appointedRepetition;

共有1个答案

柴英锐
2023-03-14

您需要另一个join,但我不能保证它会起作用,因为实体定义要么缺失,要么不完整,而且并非所有关系都按照您的注释中所述定义。不管怎样,我会试试这个:

Join<Question, AppointedRepetition> repetition = questionJoin.join("appointedRepetition");
Predicate dateCondition = criteriaBuilder.lessThan(repetition.get("date"), tomorrow);

对了,我看到你在用Joda的DateTime。我从来没有将它与JPA CriteriaBuilder一起使用过,所以我不能保证它能工作。

 类似资料:
  • 是否可以将像这样的JPQL sting转换为对象,在该对象中我可以检查查询的根是否为(使用),或者以不同的方式执行相同的操作(不转换为)? JPA文档非常简单(例如,的类注释说“返回一个CriteriaBuilder的实例以创建CriteriaQuery对象。”-10或20个句子和更多的引用也无妨)。因此,它没有提到任何关于反转进程的内容。 将jpql连接查询转换为条件api以及如何将带有子查询的

  • 我需要将这个sql查询转换为hibernate条件,请大家帮忙。 按名称顺序按应用描述限制3从设备组中选择名称,计数(*)为应用

  • 任何帮助都将不胜感激!

  • 具有由5个实体组成的简单对象模型: 公司 公司与单个组织关联。(团体和俱乐部也与单个组织关联——它们是单向的,这意味着该组织不包含对其所有者的引用)。一个组织可能有0个或多个地址。 子查询可用于基于特定zipcode(地址的属性)访问公司对象。这里是一个JPQL查询,可以使用特定的zipcode访问这些公司。 @Query("选择p从公司p,组织组织(p.organization=org.id)和

  • 我在Mysql中有一个查询, 我已经完成了简单的查询转换为hibernate查询。我将所有pojo类绑定到表。请指导我如何将多个连接查询转换为一个hibernate查询。

  • subcompany.hbm.xml 子单位表 branch.java 指定表 我需要帮助编写条件查询使用提供的SQL。