2014-02-10 51 views
0
Criteria criteria = sessionProvider.getCurrentSession().createCriteria(Foo.class); 
criteria.createAlias("game", "game"); 
if (from != null) criteria.add(Restrictions.ge("game.created", from.toDate())); 
if (to != null) criteria.add(Restrictions.lt("game.created", to.toDate())); 
criteria.setProjection(Projections.distinct(Projections.property("game"))); 
      criteria.addOrder(Order.desc(("game.created"))); 
      criteria.setMaxResults(100); 
      games = criteria.list(); 

我使用上面的代碼來獲取遊戲。實體Foo有一個名爲的遊戲。我需要獲取遊戲引用,雖然Foo。但是當我運行上面的代碼時,出現以下錯誤。如何在投影和訂單中使用標準?

Caused by: org.postgresql.util.PSQLException: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 
    Position: 246 

如何正確添加投影和訂單?

回答

1

你有邏輯錯誤,你試圖讓水木清華這樣的:

Select Distinct game From Foo Order By created 

其邏輯錯誤,服務器通過「創建」,因爲只有「遊戲」欄目存在,並且排序「創建不能爲了結果「 不可能。

+0

但是遊戲是創建的列。 – dinesh707

+0

您可以按「遊戲」列排序,它出現在結果列表中。 「已創建」列在結果列列表中不可用,並且您無法按此列進行排序。 – pasha701

+0

Thankx。現在我明白了。問題是,當我選擇「獨特」時,它沒有獨特的創造價值。所以我認爲唯一的方式是手動查詢和排序 – dinesh707

1

有同樣的問題,我用

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

,而不是

Projections.distinct 

它爲我工作。