我正在使用hibernate和hql在Java代码中进行查询。但是我有这样一个例外:
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 ... }
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应该有问题吗?
发现问题:
即使HQL可以正确转换为sql,但是当ResultTransformer获取结果时,结果中将只有3个字段:
1. A 2. length 3. unit
无论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