2013-07-03 23 views
1

實體錯誤criteria.list

@javax.persistence.Entity 
@javax.persistence.Table(name = "entidade") 
public class Entidade { 
    private static final long serialVersionUID = -6831078183847196839L; 
    @EmbeddedId 
    @AttributeOverrides({ 
      @AttributeOverride(name = "id_titulo", column = @Column(name = "titulo_id", nullable = false)), 
      @AttributeOverride(name = "id_empresa", column = @Column(name = "empresa_id", nullable = false)) }) 
    private PK pk; 
//getter//setter 
} 

// PK

@Embeddable 
public class PK implements Serializable { 
    private static final long serialVersionUID = -5441836698300495848L; 

    @javax.persistence.Column(name = "id_titulo") 
    private Long titulo_id; 

    @javax.persistence.Column(name = "id_empresa") 
    private Long empresa_id; 

     //getter // setter 
} 

查詢確定:如果實例的PK二傳手

Criteria criteria = novoCriteria(); 
    criteria.createAlias("id", "id"); 
    TituloPK pk = new TituloPK(); 
    pk.setEmpresa(2L); 
    pk.setTitulo(6364L); 
    criteria.add(Restrictions.eq("id", pk)); 
    criteria.list(); 

查詢錯誤

Criteria criteria = novoCriteria(); 
    criteria.createAlias("id", "id"); 
    criteria.add(Restrictions.eq("id.id_empresa", 2L)); 
    criteria.list(); 

錯誤控制檯:*無法解析屬性:的id_empresa:Entidade *

只需要通過公司搜索,如果我用約束返回上面的錯誤。

+2

看起來'id_empresa'是列名。你需要用類'Entidade' - >'id.javaField'(也許是'id.pk',但我不知道'EmbeddedId'的作用)的java字段替換它 –

+0

將你的'PK'類添加到你的問題中我們可以檢查您是否使用正確的語法來添加限制。 – eternay

回答

0

Criteria中,正如您所知,您必須使用該類成員的名稱,而不是數據庫中該字段的名稱。但@AttributeOverride註釋並不覆蓋PK類中的此屬性,但僅在Entidade類中。因此,您必須使用該屬性的名稱,因爲它在PK類中聲明,即id.empresa_id

所以,你的代碼應該是:

Criteria criteria = novoCriteria(); 
    criteria.createAlias("id", "id"); 
    criteria.add(Restrictions.eq("id.empresa_id", 2L)); 
    criteria.list(); 

在我的項目之一,我可以重現你的錯誤,並使用嵌入類的參數的名稱可以解決這個問題。我認爲它也適用於你。

+0

我首先犯了一個錯誤,因爲我沒有看到'@ AttributeOverride',所以我決定刪除我的答案。但現在,我認爲這個解決方案是正確的。告訴我,如果你能用這個技巧解決你的問題。 – eternay

相關問題