Question

I have a sql statement as follows,

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 ;

I tried to convert it to HQL as follows,

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

Am i correct?.

Was it helpful?

Solution

You're not requesting a distinct projection, and you can't just go .in(subquery) you have to use the Subqueries class, other than that it looks ok.

 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);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top