[英]Setting up query for specific field of Hibernate entity
我用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);
}
}
但是app无法在org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory上使用NullPointerException启动bean初始化
我还尝试了以下内容:
将公式置于“私有字符串specField”之上 - 应用程序已启动,但是hibernate失败则无法在数据库中找到spec_field
把@Formula和@Transient放在getter上 - app启动,没有错误,但是specField总是为null。 看起来hibernate完全忽略了它
为什么不:
public String getSpecField() {
return MoreObjects.firstNonNull(field1,field2);
}
您可以利用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 }
如果您正在使用休眠,请尝试以下操作:
@Formula("COALESCE(field1, field2)")
public String getSpecField() {
return specField;
}
注意: - 据我所知,JPA没有其他选择。 请注意这将混淆hibernate和jpa注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.