Java 使用Transformer时休眠异常PropertyNotFoundException

Java 使用Transformer时休眠异常PropertyNotFoundException,java,hibernate,Java,Hibernate,我在Java代码中使用hibernate和hql进行查询。但我有一个例外: Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class [my class] at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44) A - A_ID - NAM

我在Java代码中使用hibernate和hql进行查询。但我有一个例外:

Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class [my class]
    at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
A
- A_ID
- NAME

B
- B_ID
- A_ID

C
- C_ID
- B_ID
- LENGTH
- UNIT
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
我不明白“0”是什么意思。以下是一些死亡案例:

我有几个表连接hql。表格如下所示:

Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class [my class]
    at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
A
- A_ID
- NAME

B
- B_ID
- A_ID

C
- C_ID
- B_ID
- LENGTH
- UNIT
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
课程:

@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
    ...
}
查询:

Query query = session.createQuery(hql.toString()).setResultTransformer(Transformers.aliasToBean(A.class));
结果是对象“a”的列表,其中包含收集的长度和单位。我不明白为什么我会有这个例外。请给我一些建议


更新:

我编写了一个ResultTransformer并输出了所有的“别名”以查看问题:

-> 0
-> length
-> unit
除了长度和单位外,它似乎还处理“A”。我的HQL?

@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;
    }
}
发现的问题:

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

1. A
2. length
3. unit
无论A中有多少个字段,它们都将聚合为一个字段“A”,并且由于我没有为该字段设置任何别名,因此它将被视为“字段0”

因此,在我更改HQL后,问题解决了,如下所示:

Caused by: org.hibernate.PropertyNotFoundException: Could not find setter for 0 on class [my class]
    at org.hibernate.property.ChainedPropertyAccessor.getSetter(ChainedPropertyAccessor.java:44)
A
- A_ID
- NAME

B
- B_ID
- A_ID

C
- C_ID
- B_ID
- LENGTH
- UNIT
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

我有所有领域的二传手和传接手。对不起,我在代码中没有提到。代码已更新。添加“@Access(AccessType.FIELD)”意味着什么?当放置在字段或属性上时,getter@Access可以指定应该覆盖此字段的默认值。在Hibernate中使用“@Access(AccessType.FIELD)”使用@AccessType访问字段谢谢。问题仍然存在,我不明白为什么在这个异常中有一个“0”…没有表文件的setter和getter。对不起,我有类的getter和setter。我忘了将它们添加到示例中。所以我认为这不是原因。还有两个问题:1。为什么异常为“0”?2.getter对这一点重要吗?检查表文件和pojo的字段是否相同?是的,我认为是这样。我试图使用生成的SQL直接对数据库运行,并正确获取数据。发现问题。内容中有更新。太棒了!你救了我!:)最后回答这个问题!我将它与.setResultTransformer(Transformers.aliasToBean(MyClass.class))结合使用,以获得bean列表。我有一个POJO类,它在camelCase中有字段,比如“折扣细节”。我在查询中定义了正确的别名,即,
选择折扣\u detail作为库存中的折扣细节,其中…
但当hibernate返回结果集时,它返回“折扣细节”,因此我得到一个异常,即属性“折扣细节”的setter未找到。你知道这个问题吗?