2014-03-25 54 views
1

我想知道如何使用Criteria Query来生成此查询,我能够使用JPQL完成此任务,但需要使用JPA Criteria Query。 查询是:使用Criteria Builder获取每个人的最新记录

select user_id, user_name, borrowing_date 
    from books_record b 
    where (user_id, borrowing_time) in (
    select br.user_id, max(br.borrowing_time) 
     from books_record br 
     group by br.user_id 
    ) 
+0

提供关系映射(Java类)结构 – Yogesh

+0

只有一个实体:只需将BooksRecord具有用户id, userName和borrowingDate – MariemJab

回答

0

以下条件应该工作,我没有测试它

//sub query 
DetachedCriteria subquery = DetachedCriteria.forClass(BooksRecord.class, "bk1"); 
ProjectionList proj1 = Projections.projectionList(); 
proj1.add((Projections.property("user_id").as("user_id")); 
proj1.add(Projections.max("borrowing_time").as("borrowing_time")); 
proj1.add(Projections.groupProperty("user_id")); 
subquery.setProjection(proj1); 

//main query 
Criteria mainQueryCriteria = getSession().createCriteria(BooksRecord.class, "bk2"); 
mainQueryCriteria.add(Restrictions.eqProperty("bk2.user_id", "bk1.user_id")); 
mainQueryCriteria.add(Restrictions.eqProperty("bk2.borrowing_time", "bk1.borrowing_time")); 
ProjectionList proj2 = Projections.projectionList(); 
proj2.add((Projections.property("user_id").as("user_id")); 
proj2.add(Projections.property("user_name").as("user_name")); 
proj2.add(Projections.property("borrowing_date").as("borrowing_date")); 
mainQueryCriteria.setProjection(proj2); 
mainQueryCriteria.setResultTransformer(Transformers.aliasToBean(BooksRecord.class)); 

List<BooksRecord> records = mainQueryCriteria.list(); 
+0

感谢您的快速响应。但是这个查询使用org.hibernate.criterion。或者我正在使用javax.persistence.criteria的JPA。 – MariemJab

+0

它是休眠标准!如果你正在寻找JPA标准,那么你应该删除'Hibernate'标签,因为它可能会造成混淆 – Yogesh