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