首页 > 解决方案 > 对 ID 引用另一个表实体的实体使用休眠 CriteriaQuery

问题描述

我有一个复杂的(对我来说)休眠查询,我想弄清楚,但我的头脑无法理解如何做到这一点。

我需要找到所有具有 EntityRegistration.userName =~ "foo" 的设备实体。

实体类:

@Entity()
@Table
public class Device {
    @Basic()
    @Column(name = "HostName")
    private String hostName = null;
    @Basic()
    @Column(name = "RegistrationID")
    private String registrationID = null;
}
@Entity()
@Table
public class EntityRegistration {
    @Basic()
    @Column(name = "ID")
    private String iD = null;
    @Basic()
    @Column(name = "UserName")
    private String userName = null;
}

Device.registrationID 映射到 EntityRegistration.iD。我不想更改表以将 EntityRegistration 作为 OneToMany 引用。

这是我根据类似查询尝试过的方法,其中有一个 OneToMany 引用而不是像这种情况下的 Basic 类型:

CriteriaBuilder builder = context.getBuilder();
Root<Device> root = context.getRoot();
Join<Device,EntityRegistration> joinReg = root.join("registrationID");
builder.lower(joinReg.get("id")), userName);

我理解为什么这段代码不起作用,但我不知道如何在我有 ID 引用的情况下正确编写查询。

标签: javahibernatejpacriteriahibernate-criteria

解决方案


您的代码片段实际上是 JPA 标准,它符合 JPA 标准。

JPA 标准不提供连接不相关实体的解决方案。参见 Hibernate 专家的文章:Vlad Mihalcea

只能使用 Hibernate QUERY:

TypedQuery<Device> q = em.createQuery(
"select d from Device d JOIN EntityRegistration e ON d.registrationID=e.id AND e.userName=?1", Device.class);
q.setParameter(1, "peter")
q.getResultList();

推荐阅读