我有一个复杂的(对我来说)hibernate查询,我试图弄清楚,我的头脑无法得到如何做到这一点。
我需要找到所有具有EntityRegistration.userName =〜“foo”的Device实体。
实体类:
@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映射到Entity Registration.iF。我不想更改表以将实体注册作为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引用的情况。
您的代码段实际上是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();