我需要使用 db2 创建一个 hibernate SQLQuery,这个查询返回一些已计算的字段,与数据库中的任何列都没有关系。
目标是在已存在的 Java 对象中的三个新 transient 字段上设置来自 SQLQuery 的 sum() 计算的值。
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。
我查看了文档并用谷歌搜索,似乎您可以通过不在 hibernate 映射文件中声明它来声明 transient 字段,但随后它不会使用“as {entityObject.”将其设置在对象上。 someCount}”,即使我声明了 getter/setter。
请帮忙。 预先非常感谢。
最佳答案
可以直接从数据库执行所有这些操作而无需发出额外查询的唯一可用选项是 Hibernate Formula 属性:
http://wiki.jrapid.com/w/Formula_(attribute_of_property)
<property name="someCount" formula="select count(*) from some_table where table_key = ?"/>
那个?占位符将自动填充当前实例的 ID。
关于java - 具有 transient 属性的 Hibernate SQLQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139488/