【问题标题】:Using hibernate CriteriaQuery for entity which has ID ref to another table entity对 ID 引用另一个表实体的实体使用休眠 CriteriaQuery
【发布时间】:2019-03-18 19:48:07
【问题描述】:

我有一个复杂的(对我来说)休眠查询,我想弄清楚,但我的脑子就是不知道该怎么做。

我需要找到所有具有 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 引用的情况下正确编写查询。

【问题讨论】:

  • 感谢您发现这一点,但恐怕我不明白如何将其应用于我的案例。
  • 您考虑过原生查询还是不适合您?
  • 本地查询不适合我

标签: java hibernate jpa criteria hibernate-criteria


【解决方案1】:

你的代码sn-p其实就是JPA Criteria,符合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();

【讨论】:

  • 这看起来很有趣,但是如何根据我的原始帖子将其转换为 Criteria API?这就是让我头晕目眩的部分。
  • 根据我的研究,我认为这是不可能的。我没有找到以实体类为参数的join()函数。
猜你喜欢
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多