2009-09-02 16 views
2

我有一個查詢返回像這種對象的列表:返回HQL SELECT子句列實際上並沒有使用該列

select distinct ref from references where [...] 

我想用一個字段不是裁判,但在訂購這些裁判的關聯,即:

select distinct ref from references where [...] order by ref.foo.name 

可惜這並不在Oracle中,因爲它可以在此列,如果它包含在選擇工作,(一旦查詢轉換爲SQL)只排序。有什麼方法可以返回列,而沒有冬眠實際上拿起它?我想只返回一個List,而不必去關注它會返回的Object []數組。

回答

0

這是完全有可能爲甲骨文排序未包含在選擇一列的查詢:

SQL> select ename from emp 
    2 order by empno 
    3/

ENAME 
---------- 
CLARKE 
VAN WIJK 
PADFIELD 
ROBERTSON 
BILLINGTON 
SPENCER 
BOEHMER 
RIGBY 
SCHNEIDER 
CAVE 
KULASH 
HALL 
GASPAROTTO 
KISHORE 

14 rows selected. 

SQL>

但隨着你的ORDER BY子句看起來有點奇特 - order by ref.foo.name - 也許我錯過了一些微妙之處?

編輯 文森特指出,我錯過了微妙 - 使用DISTINCT

SQL> select distinct ename from emp 
    2 order by empno 
    3/
order by empno 
     * 
ERROR at line 2: 
ORA-01791: not a SELECTed expression 


SQL> 

使用DISTINCT需要的是往往指示一個設計缺陷的,所述WHERE子句中或任一缺失要素的歸一化的不充分的數據模型。儘管這對提問者可能只是需要解決方法沒有幫助。

+0

在OP案例中,由於DISTINCT,這是不可能的。使用DISTINCT時,通過不在SELECT列表中的東西排序並沒有什麼意義。 –

+0

我想我不太清楚。該查詢在HQL中。從ref到foo有多對一的關聯,這樣每個ref都會有一個ref.foo.name。在普通的SQL中,我可以自己編寫連接並將該字段添加到select,但我希望不必重寫查詢。 – wds

0

在Hibernate方面,一個簡單的解決方案就是您的DAO代碼處理您的問題。您的請求會添加列。

您的Dao方法會從Hibernate接收一個List並將其轉換。

List<Object[]> rawResults = query....; 
List<References> results = new ArrayList<References>(rawResults.size()); 
for(Object[] rawResult : rawResults) { 
    results.add(rawResults[0]); 
} 
return results; 
0

在甲骨文當您使用「聚合」功能(不同,按,計數,...)通過你需要包括SELECT子句中去所需字段的結果進行排序,因爲「不同'子句就像'group by'一樣工作,hibernate正在做的是使用'distinct'聚合來選擇對象中的所有列。也許你應該嘗試在HQL中使用'group by'函數,這樣hibernate可以按照正確的形式將函數中的加入轉換成組。

相關問題