2

Java コードでのクエリに hibernate と hql を使用しています。しかし、私はこのような例外を得ました:

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」の意味がわかりません。例を含むいくつかの詳細は次のとおりです。

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
    ...
}

本社:

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に問題があるはずですか?

4

2 に答える 2

10

問題が見つかりました:

HQL を sql に正しく変換できたとしても、ResultTransformer が結果を取得すると、結果には 3 つのフィールドしかありません。

1. A
2. length
3. unit

A のフィールド数に関係なく、それらは 1 つのフィールド "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
于 2012-12-12T09:53:39.160 に答える
0

@Access(アクセスタイプ.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;
    }
}
于 2012-12-12T07:26:24.197 に答える