2013-05-16 36 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); 

從商務的角度來看,它絕對相同,不需要硬解決方案。