【发布时间】:2013-12-07 00:23:17
【问题描述】:
我需要用 db2 创建一个休眠 SQLQuery,这个查询返回了一些经过计算的字段,这些字段与数据库中的任何列都没有关系。
目标是将 SQLQuery 中这些 sum() 计算的值设置在已存在的 Java 对象中的三个新瞬态字段上。
SQLQuery 使用语法:
SELECT id as {entityObject.id},
name as {entityObject.name},
order as {entityObject.order},
SUM(CASE
WHEN pv.value_id = 1
AND pv.value=1 THEN 1 ELSE 0 END) AS {entityObject.someCount}
问题是 Hibernate 抱怨说需要为 someCount 提供一个列。似乎没有帮助将 java 字段声明为 transient 甚至使用 javax.persistence 中的 @Transient 注释同时。
如果我只在hbm.xml映射文件中声明:
<property name="id" type="java.lang.Integer" column="someColumn" />
<!-- Some more fields here -->
<!-- THE IMPORTANT ONE -->
<property name="someCount" type="java.lang.Integer"/>
Java 对象:
public class EntityObject implements Serializable {
private static final long serialVersionUID = 1479579608940145961L;
private Integer id;
private String name;
private Integer order;
// This is the one giving me hell. I've tried with @Transient also
private transient Integer someCount;
public Category() {
}
public Category(final String name, final Integer order) {
this.name = name;
this.order = order;
}
public Integer getOrder() {
return this.order;
}
public void setOrder(final Integer order) {
this.order = order;
}
public Integer getId() {
return this.id;
}
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
public Integer getSomeCount() {
return someCount;
}
public void setSomeCount(final Integer count) {
this.someCount = count;
}
}
它要求我提供一个列,我尝试插入一个假列,但它不起作用。问题是我希望这些“计数”字段仅从 SQLQuery 设置,并且在来自常规 Hibernate 查询时为空和 null。
我查看了文档并用谷歌搜索,似乎您可以通过仅不在休眠映射文件中声明它来声明一个瞬态字段,但随后它不会在具有“as {entityObject. someCount}" 即使我声明了 getter/setter。
请帮忙。 提前非常感谢。
【问题讨论】:
-
Hibernate 不会“看到”瞬态字段。在查询返回后,您必须进行聚合查询并将结果放在代码中的字段中。
-
首先,谢谢。其次,¿如果我不能将它们直接从 SQLQuery 映射到对象,我该如何获取这些值?
标签: java sql hibernate hibernate-mapping