2013-01-02 49 views
0

我想在Hibernate中執行一個命名查詢。該查詢在這個映射文件中定義:休眠命名查詢與聚合函數

<?xml version="1.0"?> 

<class name="MxePosition" table="MY_TABLE"> 
    <id name="id" column="MY_ID" /> 
    <property name="quantity" /> 
    <property name="instrument" /> 
</class> 

<sql-query name="getPositionsForPortfolio"> 
    <return alias="position" class="com.example.domain.MxePosition"/> 
    <![CDATA[ 
     SELECT 
     SUM(LEG_ONE_NOMINAL) AS {position.quantity}, 
     ID_INSTRUMENT AS {position.instrument} 
     FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY ID_INSTRUMENT 
    ]]> 
</sql-query> 

的MxePosition類如下:

public class MxePosition { 

private Long id; 
private String instrument; 
private double quantity; 

public String getInstrument() { 
    return instrument; 
} 
public void setInstrument(String instrument) { 
    this.instrument = instrument; 
} 
public double getQuantity() { 
    return quantity; 
} 
public void setQuantity(double quantity) { 
    this.quantity = quantity; 
} 
public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 
} 

我所試圖做的就是該命名查詢返回由另一列分組的一列的總和。然而,Hibernate正在拋出一個我懷疑是因爲查詢結果不包含ID列的錯誤。

18:06:44,728 ERROR JDBCExceptionReporter:101 - Column not found: MY1_1_0_ 

有沒有辦法解決這個問題?在Hibernate中必須可以執行包含GROUP BY子句的查詢,而不在結果中包含ID。

我打開其他建議,如果有更好的方法不使用命名查詢。

回答

1

你可以簡單地添加一個「隨機」標識的查詢結果集,使Hibernate的快樂即

SELECT 
    MAX(YOUR_ID_COLUMN) AS {position.id}, 
    SUM(LEG_ONE_NOMINAL) AS {position.quantity}, 
    ID_INSTRUMENT AS {position.instrument} 
    FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY ID_INSTRUMENT 
+0

好的解決方案,這確實讓Hibernate保持高興。它有點解決方法,但我不能看到任何其他方式 – cowls

0

我認爲問題在於你的數據庫,而不是休眠。我懷疑它不支持使用「group by」與別名列。

你試過:

FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY {position.instrument} 
+0

我只是試了一下,沒有變化 – cowls

0

我居然找到了一個更好的解決這個(對於我的情況)不會適用於所有情況。

將儀器和數量設置爲組合鍵意味着我可以完全擺脫ID字段。我說這我的XML映射

<composite-id> 
     <key-property name="portfolio" /> 
     <key-property name="instrument" /> 
    </composite-id> 

我會留下接受的答案,因爲它有助於在當時(和現在在我原來的問題組合列wasnt)。