【发布时间】: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关系,每个Questions与AppointedRepetition有OneToOne关系,AppointedRepetition没有Question的知识,只是单向关系。
标签: jpa jpql criteria-api