2012-09-06 100 views
1
充满

我已经和@Formula注释计算特性对我实体之一:计算财产不受休眠

@Entity 
@Table(name="PERSON") 
public class Person { 

    @Searchable(name = "First name") 
    private String firstName; 

    @Column(name = "FIRST_NAME", nullable=false) 
    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Searchable(name = "Last name") 
    private String lastName; 

    @Column(name = "LAST_NAME", nullable=false) 
    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @Formula("FIRST_NAME || ' ' || LAST_NAME") 
    private String loFstLstName; 

    public String getLoFstLstName() { 
     return this.loFstLstName; 
    } 

    public void setLoFstLstName(String loFstLstName) { 
     this.loFstLstName = loFstLstName; 
    } 
} 

的问题是,我只有零点在persons列表下面的代码:

Query q = entityManager.createQuery("SELECT loFstLstName FROM Person"); 
List persons = q.getResultList(); 

PERSON表包含具有值从零在FIRST_NAMELAST_NAME领域不同的记录。我使用Hibernate 3.3和PostgreSQL 8.4.9。我究竟做错了什么?

+0

您的意思是说,查询返回的'loFstLastName'的每个值都是null?如果是这样,你如何运行查询?通过JPA的EntityManager?通过休眠会话?显示你的代码。另外,虽然它不能解释所有*值为空,但请注意,'something'NULL是NULL。你必须使用'coalesce(FIRST_NAME,'')|| ''||如果“FIRST_NAME”和/或“LAST_NAME”可能为空,合并(LAST_NAME,'')'。 –

+0

查询正在通过JPA的EntityManager运行。其结果中的每个值都为空。正如你所建议的,我尝试过使用'coalesce'。它没有帮助。 – vect

+0

除非@ axtavt的答案(这是一个好点)可以解决问题,请更新问题以显示您为问题查询运行的实际代码。 –

回答

2

您不应该在同一实体内混合不同的访问类型(即在属性和字段上放置注释)(除非您明确地使用@Access配置它)。请尝试以下操作:

@Formula("FIRST_NAME || ' ' || LAST_NAME") 
public String getLoFstLstName() { 
    return this.loFstLstName; 
} 
+0

我试过了。它会导致以下部署异常:'java.lang.ClassCastException:org.hibernate.mapping.Formula无法转换为org.hibernate.mapping.Column' – vect

+0

@vect:您能否显示完整的堆栈跟踪? – axtavt

+0

[Here](http://paste.org.ru/?jcp9x2) – vect