当使用连接在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 ...
}
答案 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)