Hibernate Query.list返回实际的Object实例而不是预期的类型

时间:2013-08-15 18:17:32

标签: java hibernate hql

当使用连接在HQL中执行hibernate查询并随后调用query.list以返回匹配对象列表时,我最终会得到一个实际的Object实例列表(即query.list().get(0).getClass() == Object.getClass())而不是预期对象的实例。

在没有连接的情况下运行查询会正确返回预期类型的​​对象,并且可以正确地转换和使用它们。

到目前为止,我的搜索没有发现可能导致此问题的任何内容。在hql中使用连接以确保正确映射对象时,我还需要做些什么吗?

编辑:添加了以下代码摘录。我不得不更改所有名称,并尝试仅提取相关部分(真正的代码不是真正关于汽车)。

工作查询:

from Car car where car.name like :name

非工作查询:

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

汽车实体:

@Entity
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"someId"}), 
                            @UniqueConstraint(columnNames = {"someOtherId"})})
public class Car extends SomeParentEntity
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 64)
    private String someId;

    @Column(length = 64)
    private String name;

    // ... Many columns and mappings removed ...

    @OneToMany(mappedBy = "car", fetch = FetchType.LAZY)
    private List<Occupant> occupants;

    // ...
}

居住实体:

@Entity(name = "car.Occupant")
@Table(uniqueConstraints = {@UniqueConstraint(columnNames = { "name" }) })
public class User extends SomeParentEntity
{

    @ManyToOne
    @JoinColumn(name = "carId", nullable = false)
    private Car car;

    @Column(length = 64, nullable = false)
    private String name;

        // ... Many mappings / columns removed ...
}

3 个答案:

答案 0 :(得分:3)

HQL中的JOIN使Hibernate检索两种类型的对象。如果激活SQL日志记录,则可以看到此信息。

假设您的实体中存在X-to-X关系,如果您更改查询以使用

,问题就会消失
... JOIN FETCH entity.relation ...

答案 1 :(得分:2)

为什么使用显式左连接btw。

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

我认为我们可以简单地使用:

from Car car where car.name like :name or car.occupant.name like :oname

然后query.list应该给你一个应该被转换回汽车列表的对象列表

答案 2 :(得分:2)

对于你的帮助,

+ 1到了其他的回答者,非常感谢。

然而,解决方案结果非常简单。查询只需要在连接情况的开头指定选择,以缩小字段(我假设)。

所以非工作查询:

from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)

变为:

select car from Car car left join car.occupants occupant where car.name like :name OR (occupant.name like :oname)