【发布时间】:2015-12-08 18:27:09
【问题描述】:
我使用弹簧和休眠。出现了以下情况,不知道是否真的可以实现。将不胜感激。
比如有个hibernate实体
@Entity
public class TestEntity {
private String field1;
private String field2;
private String specField;
@Column(name = "field1")
public String getField1() {
return field1;
}
@Column(name = "field2")
public String getField2() {
return field2;
}
public String getSpecField() {
return (field1 != null ? field1 : field2);
}
}
我需要通过 SQL 查询而不是 java 代码生成 specField 的值。 像这样的
@Entity
public class TestEntity {
private String field1;
private String field2;
private String specField;
@Column(name = "field1")
public String getField1() {
return field1;
}
@Column(name = "field2")
public String getField2() {
return field2;
}
@Query(value= "COALESCE(field1, field2)")
public String getSpecField() {
return specField;
}
}
有人告诉我应该有能力这样做。但没有找到任何批准这一点的东西。
查询究竟做了什么实际上并不重要。我需要那个 specField 将被一些查询而不是 java 代码。有可能吗?
感谢您的帮助。
更新感谢@premkumar,建议使用@Formula 所以现在我有
@Entity
public class TestEntity {
private String field1;
private String field2;
private String specField;
@Column(name = "field1")
public String getField1() {
return field1;
}
@Column(name = "field2")
public String getField2() {
return field2;
}
@Formula("COALESCE(field2, field2)")
public String getSpecField() {
return (field1 != null ? field1 : field2);
}
}
但应用程序无法在 bean 初始化时启动 org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory 处的 NullPointerException
我还尝试了以下方法:
将公式放在“私有字符串 specField”之上 - 应用已启动,但休眠失败,因为无法在数据库中找到 spec_field
将 @Formula 和 @Transient 放在 getter 上 - 应用程序已启动,没有错误,但 specField 始终为空。看起来hibernate完全忽略了它
【问题讨论】:
-
为什么不使用@PrePersist 或@PreUpdate 为该实体设置字段中的值?
-
你的意思是 specField 应该有值(field1 + ", "+ field2)吗?如果不是你能更清楚
-
@RossiRobinsion 我实际上并不知道。我现在研究一下
-
@premkumar specField 应该是 field1 如果 field2 为 null 或 field2 如果 field1 为 null
标签: java mysql spring hibernate