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

时间:2015-12-08 18:27:09

标签: java mysql spring hibernate

我使用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

我还尝试了以下内容:

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

  2. 将@Formula和@Transient放在getter上 - 应用程序启动,没有错误,但specField始终为null。看起来hibernate完全忽略了它

3 个答案:

答案 0 :(得分:1)

为什么不:

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

答案 1 :(得分:1)

您可以利用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
    }
    

答案 2 :(得分:1)

如果您正在使用休眠,请尝试以下操作:

@Formula("COALESCE(field1, field2)")
public String getSpecField() {
    return specField;
}

注意: - 据我所知,JPA没有其他选择。请注意这将混淆hibernate和jpa注释。