我正在使用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应该有一些问题吗?
答案 0 :(得分:9)
发现问题:
即使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
答案 1 :(得分:0)
@Access(AccessType.FIELD)
添加每个字段的getter和setter
@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;
}
}