【问题标题】:Hibernate exception PropertyNotFoundException when using Transformer使用 Transformer 时的休眠异常 PropertyNotFoundException
【发布时间】: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 运行并正确获取数据。
  • 发现问题。更新在内容中。

标签: java hibernate


【解决方案1】:

@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;
    }
}

【讨论】:

  • 我有所有领域的设置器和获取器。对不起,我没有在代码中提到这一点。代码已更新。添加“@Access(AccessType.FIELD)”是什么意思?
  • 当放置在字段或属性上时,@Access 可以指定该字段的默认值应该被覆盖。
  • 在 Hibernate 中使用“@Access(AccessType.FIELD)”使用@Accesstype 进行字段访问
  • 谢谢。问题仍然存在,我不明白为什么该异常中有一个“0”...
【解决方案2】:

发现问题:

即使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

【讨论】:

  • 太棒了!你救了我! :)
  • 终于回答可行了!我将它与 .setResultTransformer(Transformers.aliasToBean(MyClass.class)) 结合使用以获取 bean 列表。
  • 我有一个 POJO 类,它在 camelCase 中有字段,比如“discountDetail”。我在查询中定义了正确的别名,即select discount_detail as discountDetail from Inventory where ...,但是当休眠返回结果集时,它返回'discountdetail',因此我得到一个异常,即找不到属性'discountdetail'的设置器。对这个问题有任何想法吗?
猜你喜欢
  • 2011-02-14
  • 2018-12-07
  • 2014-06-16
  • 2014-08-22
  • 2011-09-20
  • 2017-07-06
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多