【发布时间】:2012-11-29 20:42:51
【问题描述】:
我使用 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 应该有问题吧?
【问题讨论】:
-
没有表字段的setter和getter
-
抱歉,我有类的 getter 和 setter。我忘了将它们添加到示例中。所以我认为他们不是原因。还有2个问题:1.为什么异常是“0”? 2. getter 对此有影响吗?
-
检查表字段和pojo的字段是否相同?
-
是的,我想是的。我尝试使用生成的 SQL 直接针对 DB 运行并正确获取数据。
-
发现问题。更新在内容中。