【问题标题】:Hibernate Named Query with Aggregate function具有聚合函数的休眠命名查询
【发布时间】:2013-01-02 18:09:15
【问题描述】:

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

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

【问题讨论】:

    标签: java hibernate named-query


    【解决方案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
    

    【讨论】:

    • 不错的解决方案,这确实让 Hibernate 高兴。它有点解决方法,但我看不到任何其他方式
    【解决方案2】:

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

    你试过了吗:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        相关资源
        最近更新 更多