将SQL查询转换为HQL

时间:2014-05-09 05:07:18

标签: sql hibernate select pagination hql

我有一个sql语句如下,

select *
from (select distinct field1
from X
where field2 = 'value2'
and field3 > 'value3'
and field4 in(value4)
and field5 in(value5)
and field6 is null 
order by field1)
where ROWNUM <= 20 ;

我尝试将其转换为HQL,如下所示,

 DetachedCriteria detachedQuery = DetachedCriteria.forClass(X.class)
     .setProjection(Projections.property("field1"))
     .add(Restrictions.eq("field2",value2))  
     .add(Restrictions.gt("field1", value1))
     .add(Restrictions.in("field3",value3))
     .add(Restrictions.in("field4", value4))
     .add(Restrictions.isNull("field5"))
     .addOrder(Order.asc("field1"));

     Criteria criteria= session.createCriteria(X.class);
     criteria.add(Property.forName("field1")
         .in(detachedQuery))
         .setMaxResults(20);

我是否正确?。

1 个答案:

答案 0 :(得分:1)

您并未请求明确的投影,而且您只能.in(subquery)必须使用Subqueries类,除了看起来没问题。

 DetachedCriteria detachedQuery = DetachedCriteria.forClass(X.class)
 .setProjection(Projections.distinct(Projections.property("field1")))
 .add(Restrictions.eq("field2",value2))  
 .add(Restrictions.gt("field1", value1))
 .add(Restrictions.in("field3",value3))
 .add(Restrictions.in("field4", value4))
 .add(Restrictions.isNull("field5"))
 .addOrder(Order.asc("field1");

 Criteria criteria= session.createCriteria(X.class);
 criteria.add(Property.forName("field1")
     .in(detachedQuery))
     .setMaxResults(20);