java - 对 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 引用的情况下正确编写查询。
解决方案
您的代码片段实际上是 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();
推荐阅读
- javascript - 如何使用该表中的按钮发送谷歌电子表格
- android - 如果服务器在 VMware 上运行,Meteor Cordova Android 应用程序无法连接到服务器
- ruby-on-rails - Ruby on Rails,在 activerecord-import 之后创建多对多关联
- firebase-realtime-database - 在 Xcode 10 中使用 GeoFire 设置用户位置
- java - org.hibernate.service.UnknownServiceException:请求未知服务 [org.hibernate.ogm.service.impl.OgmConfigurationService]
- apache-spark - pyspark - 行的 argmax(双
) 在 1 列内 - python-3.x - cdm 无法将 PyInstaller 识别为命令 - Python 3.7.3
- visual-studio-code - VS Code 中的 Hugo 模板格式
- python - 从 KivyMD 制作 MDTextField 工作正常
- javascript - 无法从 Express Route 查询 MySQL 数据库