【问题标题】:jpa - transforming jpql join query to criteria apijpa - 将 jpql 连接查询转换为条件 api
【发布时间】:2013-05-29 16:55:13
【问题描述】:

我试图转换这个 JPQL 查询;

SELECT s FROM QuestionSet s JOIN s.questions q WHERE q.appointedRepetition.date  < :tomorrow

与其标准 api 等效,这是我目前所拥有的:

    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]]]

看看How to convert a JPQL with subquery to Criteria API equivalent?,我在标准api部分有几乎相同的代码。

@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;

【问题讨论】:

  • 什么是appointedRepetition?也许它是一个与Question 具有多对一关系的实体?很多问题,一个指定重复?在那种情况下你需要另一个加入,我可以告诉你
  • 我添加了代码呈现模型的sn-ps,QuestionSet与Question实例有OneToMany关系,每个QuestionsAppointedRepetitionOneToOne关系,AppointedRepetition没有Question的知识,只是单向关系。

标签: jpa jpql criteria-api


【解决方案1】:

您需要另一个联接,但我不能保证它会起作用,因为实体定义要么丢失要么不完整,而且并非所有关系都按照您的评论中所述进行定义。无论如何,我会试试这个:

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

顺便说一句,我看到您正在使用 joda 的 DateTime。我从未将它与 JPA CriteriaBuilder 一起使用,所以我不能保证它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2021-02-15
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    相关资源
    最近更新 更多