我正在尝试在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。
如果有更好的方法,我愿意接受不使用命名查询的其他建议。
答案 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>
我会留下当时帮助的答案(并且我的原始问题中没有出现投资组合栏)。