繁体   English   中英

为Hibernate实体的特定字段设置查询

[英]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初始化

我还尝试了以下内容:

  1. 将公式置于“私有字符串specField”之上 - 应用程序已启动,但是hibernate失败则无法在数据库中找到spec_field

  2. 把@Formula和@Transient放在getter上 - app启动,没有错误,但是specField总是为null。 看起来hibernate完全忽略了它

为什么不:

public String getSpecField() {
   return MoreObjects.firstNonNull(field1,field2);
}

您可以利用JPA Callback方法:

  1. 创建一个EntityListener:

     public class MyEntityListener { @PrePersist @PreUpdate public void prePersist(Object object) { if(object instanceOf TestEntity ) { object.specField = object.field1 != null ? object.field1 : object.field2 } } } 
  2. 使用@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM