具有聚合函数的休眠命名查询
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>
我会留下当时有帮助的已接受答案(并且我的原始问题中没有投资组合列)。
【讨论】:
以上是关于具有聚合函数的休眠命名查询的主要内容,如果未能解决你的问题,请参考以下文章