当前位置: 首页 > 面试题库 >

使用Transformer时休眠异常PropertyNotFoundException

常乐
2023-03-14
问题内容

我正在使用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应该有问题吗?


问题答案:

发现问题:

即使HQL可以正确转换为sql,但是当ResultTransformer获取结果时,结果中将只有3个字段:

1. A
2. length
3. unit

无论A中有多少个字段,它们都将被汇总到单个字段“ A”中,并且由于我没有对此字段设置任何别名,因此它将被视为“字段0”。

因此,在我像这样更改HQL之后,问题解决了:

html" target="_blank">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


 类似资料:
  • 问题内容: 我有一个“复杂”的问题。 我正在使用Hibernate / JPA与数据库进行事务。 我不是DBA,客户端使用了我的应用程序,即RESTful Web服务。我的问题是数据库已更改(不是很频繁,但仍在更改)。另外,客户端并不总是尊重我的应用程序的输入(长度,类型等)。发生这种情况时,Hibernate会引发异常。异常很难翻译和从日志中读取,因为它具有嵌套的异常并且由很多文本组成:就像我说

  • 问题内容: 我在注释和上遇到了问题。在Hibernate中运行代码时,我得到: 引起原因:org.hibernate.PropertyAccessException:无法通过com.test.entities.EmployeeId.serverId的反射设置器设置字段值 但是,让我们从头开始…我有一个实体的复合主键,它由指向其他两个实体(和)的外键组成。为了设计简洁,我在Employee实体中使用

  • 问题内容: 从Weblogic 11c切换到Weblogic 12c后,出现此异常: 我发现了有关该主题的其他问题,但是所有解决方案都是关于错误的库的(Vaadin 7-Bean Validation )。我认为我的hibernate-validator与bean验证器库匹配。这是我在WEB-INF / lib中拥有的: 可能是由其他依赖性引起的吗? 编辑 我目前在我的weblogic-appli

  • 问题内容: 这分别是我的hbm和测试代码。我正在使用Spring的HibernateTemplate。我不使用DAO。使用Spring 2.0.7的Hibernate 2.2.5 血红蛋白 测试 超级测试班 错误 问题答案: 好的,根本原因是我对集合的映射无效。感谢这篇关于复合映射的文章 错误: 正确 完整的映射

  • 问题内容: 尝试将结果集强制转换为映射类时,我收到了hibernate类的类强制转换异常…我能够查看返回的结果集中的数据…但是它以Object []的形式返回我可以将Object []设置为List …我可以正确地进行hibernate映射吗?我从查询中获取了正确的数据,但映射不正确… 映射 映射类 参加班 主要 问题答案: 对于测试,我建议您在产生类强制转换异常的语句周围放置一个try-catc

  • 问题内容: 当我执行以下代码时,发生异常: 这是我的代码: 这种行为的原因是什么? 问题答案: 这是一个有点费解,究竟是什么您正在执行的查询,但如果你需要使用冒号在本地查询,你的情况为“赋值”操作符,你应该逃避所有的结肠occurances 在您的带有查询的Java字符串,因此可能类似于: 更新: 似乎,尚无法在Hibernate本机查询中转义冒号,这是一个未解决的问题。这意味着,您不能在Hibe