具有聚合函数的休眠命名查询

Posted

技术标签:

【中文标题】具有聚合函数的休眠命名查询【英文标题】: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。

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

【问题讨论】:

【参考方案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>

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

【讨论】:

以上是关于具有聚合函数的休眠命名查询的主要内容,如果未能解决你的问题,请参考以下文章

如何对具有聚合函数的 Oracle 查询进行分组

具有自定义聚合函数的 F# 查询表达式

调优 SQL 查询:在同一张表上具有聚合函数的子查询

具有分组依据的 PostgreSQL 聚合函数

我想在具有整数名称的属性中使用聚合函数

具有动态生成列、聚合函数和无聚合列的 SQL Pivot