使用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; } }