2013-05-16 34 views
2

我有以下mysql语句SELECT * FROM (SELECT * FROM NINJA ORDER BY NAME LIMIT 0,5) AS TABLE ORDER BY NAME DESC。我不知道如何将其转换为休眠标准。我做这种select语句的原因是得到前5个结果,然后降序排列。在我目前的标准中,我在做正常的Order.addOrder(Order.desc(field))会发生什么,它会得到整个记录的最后5个结果。休眠 - 如何使用条件选择内选择

请帮忙。提前致谢。

UPDATE:

下面是我的一些代码:

Criteria ninjaCriteria = session.createCriteria(Ninja.class); 
ninjaCriteria.setFirstResult(firstResult); 
ninjaCriteria.setMaxResults(maxResult); 
if (isAscending) 
    ninjaCriteria.addOrder(Order.asc(field)); 
else 
    ninjaCriteria.addOrder(Order.desc(field)); 

注:firstResultmaxResultisAscending,并field是变量。

+0

即使与HQL派生表是不可能的:http://stackoverflow.com/questions/2433729/subquery-using-derived-table-in-hibernate-hql,并与条件查询,你可以去尽可能远,使用DetachedCriteria和另一个限制进行查询的是DetachedCriteria没有setMaxResult –

回答

3

试试这个。我希望它会工作

Criteria ninjaCriteria = session.createCriteria(Ninja.class); 
ninjaCriteria.addOrder(Order.desc("NAME")); 
ninjaCriteria.setMaxResults(5); 
+2

这将得到最后五个按降序排序。 OP希望_first_五个按降序排列。 –

2

如何才能解决这个不使用纯SQL,我认为唯一的办法,就是选择像往常一样的Ninja是清单:

Criteria ninjaCriteria = session.createCriteria(Ninja.class); 
ninjaCriteria.addOrder(Order.asc("NAME")); 
ninjaCriteria.setMaxResults(5); 

创建自定义Comparator

/** 
* Compare Ninjas by Name descending 
*/ 
private static Comparator<Ninja> ninjaNameComparator = new Comparator<Ninja>() { 
    public int compare(Ninja ninja1, Ninja ninja2) { 
     return ninja2.getName().compareTo(ninja1.getName()); 
    } 
}; 

,并用它来排序该列表下降:

Collection<Ninja> ninjas = ninjaDao.listNinja(); 
Collections.sort(ninjas, ninjaNameComparator); 

从商务的角度来看,它绝对相同,不需要硬解决方案。