2

当使用连接在 HQL 中执行休眠查询并随后调用query.list以返回匹配对象的列表时,我最终得到的是实际对象实例(即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 ...
}
4

3 回答 3

3

JOIN在 HQL 中使 Hibernate 检索两种类型的对象。如果您激活 SQL 日志记录,您可以看到这一点。

假设您的实体中有 X-to-X 关系,如果您将查询更改为使用,问题应该会消失

... JOIN FETCH entity.relation ...
于 2013-08-15T18:24:49.383 回答
2

你为什么要使用显式左连接顺便说一句。

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 应该为您提供对象列表,该对象应该被转换回汽车列表

于 2013-08-15T19:26:59.123 回答
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)
于 2013-08-15T21:21:38.007 回答