2012-12-12 88 views
2

我使用hibernate和hql在我的Java代碼中查詢。但我得到了這樣一個例外:當使用Transformer時Hibernate異常PropertyNotFoundException

Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class [my class] 
    at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44) 

我不明白「0」是什麼意思。這裏有一些與例子deatils:

我有幾個表加入hql。該表是這樣的:

A 
- A_ID 
- NAME 

B 
- B_ID 
- A_ID 

C 
- C_ID 
- B_ID 
- LENGTH 
- UNIT 

類:

@Entity 
@Table(name="A") 
class A 
{ 
    @Id 
    @Column(name="A_ID", updatable=false) 
    private Long id; 

    @Column(name="NAME", nullable=false, length=10, updatable=false) 
    private String name; 

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.ALL}) 
    @JoinColumn(name="A_ID", nullable=false) 
    private Set<B> bs; 

    @Transient 
    private Double length; 

    @Transient 
    private String unit; 

    // Setters and getters 
    ... 
} 

@Entity 
@Table(name="B") 
class B 
{ 
    @Id 
    @Column(name="B_ID", updatable=false) 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="A_ID", nullable=false, insertable=true, updatable=false) 
    private A a; 

    @OneToMany(mappedBy="b", fetch=FetchType.LAZY, cascade={CascadeType.ALL}) 
    @JoinColumn(name="B_ID", nullable=false) 
    private Set<C> cs; 

    // Setters and getters 
    ... 
} 

@Entity 
@Table(name="C") 
class C 
{ 
    @Id 
    @Column(name="C_ID", updatable=false) 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="B_ID", nullable=false, insertable=true, updatable=false) 
    private B b; 

    @Column(name="LENGTH", nullable=false, updatable=false) 
    private Double length; 

    @Column(name="UNIT", nullable=false, length=10, updatable=false) 
    private String unit; 

    // Setters and getters 
    ... 
} 

HQL:

select a, sum(c.length) as length, min(c.unit) as unit 
from A a 
left outer join a.b as b 
left outer join b.c as c 
group by 
a.id 
a.name 

查詢:

Query query = session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(A.class)); 

結果是對象 「A」 的名單收集長度和單位。我不明白爲什麼我得到這個例外。請給一些建議。


更新:

我寫了使用ResultTransformer和輸出所有的 「別名」,看問題:

-> 0 
-> length 
-> unit 

看來它對待 「A」 除了與長度和單位。我的HQL應該有一些問題?

+0

沒有setter和表的吸氣申請 –

+1

對不起,我對類的getter和setter。我忘了將它們添加到示例中。所以我認爲他們不是原因。另外2個問題:1.爲什麼異常是「0」? 2.吸氣劑對此有影響嗎? – Xiezi

+0

檢查表fileds和pojo的字段是一樣的嗎? –

回答

9

發現問題的getter和setter:

即使HQL可以翻譯成正確的SQL語句,但是當使用ResultTransformer得到結果,結果中只有3個字段:

1. A 
2. length 
3. unit 

無光澤r A中有多少個字段,它們將被聚合成單個字段「A」,並且由於我沒有爲該字段設置任何別名,因此它將被視爲「字段0」。

所以解決了這個問題,我改變了HQL後是這樣的:

select a.id as id, a.name as name, sum(c.length) as length, min(c.unit) as unit 
from A a 
left outer join a.b as b 
left outer join b.c as c 
group by 
a.id 
a.name 
+0

輝煌!你救了我! :) –

+0

最後答案是有效的!我將它與 .setResultTransformer(Transformers.aliasToBean(MyClass.class)) 結合使用以獲取bean列表。 –

+0

我有一個POJO類,它有camelCase中的字段,例如'discountDetail'。我在我的查詢中定義了適當的別名,即'select discount_detail as inventoryDe​​tail from Inventory where ...',但是當hibernate返回結果集時,它返回'discountdetail',因此我得到一個異常,找不到屬性'discountdetail'的setter。有關這個問題的任何想法? – mantri

0

@Access(AccessType.FIELD)

添加每場

@Entity 
    @Table(name="A") 
    @Access(AccessType.FIELD) 
    class A 
    { 
     @Id 
     @Column(name="A_ID", updatable=false) 
     private Long id; 

     public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id= id; 
    } 
} 
+0

我擁有所有領域的制定者和獲得者。對不起,我沒有在代碼中提到。代碼已更新。通過添加「@Access(AccessType.FIELD)」是什麼意思? – Xiezi

+0

放置在字段或屬性getter時,@Access可以指定應該爲該字段覆蓋默認值。 –

+0

使用「@Access(AccessType.FIELD)」在Hibernate中使用@Accesstype進行字段訪問「 –

相關問題