Hibernate Criteria转JPA Criteria遇多关联实体适配难题
把Hibernate Criteria关联查询转成JPA CriteriaQuery的实现方法
没问题,我帮你把这段Hibernate Criteria的关联查询转成标准JPA CriteriaQuery的写法,刚好能满足你用字符串关联路径+multiselect的需求。
首先,先看对应的完整代码示例:
// 1. 获取CriteriaBuilder CriteriaBuilder cb = entityManager.getCriteriaBuilder(); // 2. 创建CriteriaQuery,这里如果要返回字段数组,泛型写Object[];如果查完整实体则写Device CriteriaQuery<Object[]> query = cb.createQuery(Object[].class); // 3. 获取查询根实体(对应Hibernate的session.createCriteria(Device.class)) Root<Device> deviceRoot = query.from(Device.class); // 4. 链式关联实体,对应Hibernate的createCriteria链式调用 // 关联deviceConfigurationTemplate(默认内连接,需要左连接的话加JoinType.LEFT参数) Join<Device, DeviceConfigurationTemplate> templateJoin = deviceRoot.join("deviceConfigurationTemplate"); // 再关联deviceModel Join<DeviceConfigurationTemplate, DeviceModel> modelJoin = templateJoin.join("deviceModel"); // 5. 使用multiselect指定要查询的字段(这里示例选Device的id、模板名称、型号名称) query.multiselect( deviceRoot.get("id"), templateJoin.get("name"), modelJoin.get("modelName") ); // 6. 执行查询,返回结果数组 List<Object[]> results = entityManager.createQuery(query).getResultList();
关键细节说明:
- Hibernate的
createCriteria("关联属性名")在JPA里等价于Root.join("关联属性名"),默认是内连接,如果需要左外连接,可以改成:deviceRoot.join("deviceConfigurationTemplate", JoinType.LEFT) - 如果你的需求是查询完整的
Device实体(而不是指定字段),可以把CriteriaQuery的泛型改成Device,然后用query.select(deviceRoot)替代multiselect,返回List<Device>;要是想立即加载关联实体,可在join时改用fetch:deviceRoot.fetch("deviceConfigurationTemplate").fetch("deviceModel"); - 用字符串指定关联路径完全适配你的迁移需求,不需要依赖类型安全的Metamodel,能快速对应上旧的Hibernate写法。
内容的提问来源于stack exchange,提问作者macmeyers50
相关产品推荐
相关产品推荐

