我使用spring和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”上方 - 应用已启动,但hibernate失败则无法在数据库中找到spec_field
将@Formula和@Transient放在getter上 - 应用程序启动,没有错误,但specField始终为null。看起来hibernate完全忽略了它
答案 0 :(得分:1)
为什么不:
public String getSpecField() {
return MoreObjects.firstNonNull(field1,field2);
}
答案 1 :(得分:1)
您可以利用JPA Callback方法:
创建一个EntityListener:
public class MyEntityListener {
@PrePersist
@PreUpdate
public void prePersist(Object object) {
if(object instanceOf TestEntity ) {
object.specField = object.field1 != null ? object.field1 : object.field2
}
}
}
使用@EntityListener注释您的类:
@Entity
@EntityListeners(MyEntityListener .class)
public class TestEntity {
private String field1;
private String field2;
private String specField;
//default cons - getters and setters
}
答案 2 :(得分:1)
如果您正在使用休眠,请尝试以下操作:
@Formula("COALESCE(field1, field2)")
public String getSpecField() {
return specField;
}
注意: - 据我所知,JPA没有其他选择。请注意这将混淆hibernate和jpa注释。