Hibernate使用Aggregate函数命名查询

时间:2013-01-02 18:09:15

标签: java hibernate named-query

我正在尝试在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。

如果有更好的方法,我愿意接受不使用命名查询的其他建议。

3 个答案:

答案 0 :(得分:1)

你可以简单地在查询结果集中添加一个“随机”ID,让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

答案 1 :(得分:0)

我认为问题出在你的数据库上,而不是hibernate。我怀疑它不支持使用别名列“group by”。

你试过了吗?

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

答案 2 :(得分:0)

我实际上找到了一个更好的解决方案(对于我的情况)不能适用于所有情况。

将仪器和数量设置为复合键意味着我可以完全摆脱ID字段。我将此添加到我的映射XML

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

我会留下当时帮助的答案(并且我的原始问题中没有出现投资组合栏)。