java - 使用 Transformer 时的 Hibernate 异常 PropertyNotFoundException

标签 java hibernate

我正在使用 hibernate 和 hql 在我的 Java 代码中进行查询。但我遇到了这样的异常(exception):

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

类(class):

@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”的列表,其中包含收集的长度和单位。我不明白为什么我会得到这个异常(exception)。请大家给点建议。

<小时/>

更新:

我写了一个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

关于java - 使用 Transformer 时的 Hibernate 异常 PropertyNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13834777/

相关文章:

java - Android list 文件有问题

java - 如何从 Maven 依赖项中排除某些包(在 JAR 中)?

java - Lucene 良好实践和线程安全

hibernate - 为什么每个应用程序只使用一个 SessionFactory 对象?

hibernate - 通过 Hibernate 保留 Joda-time 的 DateTime

java - 如何正确建模复杂的层次结构并与 hibernate 交互

java - Ant : suppress console logs from antlr

java - Java 8 time api 如何选择 DST 更改周期的偏移量

Spring 、JUnit 和 EasyMock : EntityNotFoundException

mysql - 在 MySQL 中将 GenerationType.SEQUENCE 与 Hibernate 一起使用是个好主意吗?