使用Transformer时HibernateexceptionPropertyNotFoundException
我正在使用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”是什么意思。 以下是一些带有示例的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 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 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 ab as b left outer join bc 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 ab as b left outer join bc as c group by a.id a.name
@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; } }