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。

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

4

3 回答 3

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
于 2013-01-02T18:23:03.973 回答
0

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

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

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

我将留下当时接受的答案(并且我的原始问题中没有投资组合列)。

于 2013-01-11T10:02:00.310 回答
0

我认为问题在于您的数据库,而不是休眠。我怀疑它不支持将“group by”与别名列一起使用。

你有没有尝试过:

FROM MY_TABLE WHERE SRC_PORTFOLIO= :portfolio GROUP BY {position.instrument} 
于 2013-01-02T18:18:35.670 回答