难以将此休眠标准转换为JPA标准,与多个关联实体有关

时间:2018-03-30 14:14:25

标签: java hibernate jpa criteriaquery javax.persistence

我正在尝试更改的hibernate条件查询看起来像这样

Criteria crit = 
session.createCriteria(device.class)
.createCriteria("deviceConfigurationTemplate")
.createCriteria("deviceModel");

我想简单地将其更改为使用JPA CriteriaQueries。我遇到的问题是javax.persistence如何创建一个带有多个被称为实体的实体的查询作为字符串传入。我想使用JPA根标准并使用criteriaQuery这样多选它们

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Device> cq = cb.createQuery(Device.class);
Root<DeviceModel> model = cq.from(DeviceModel.class);
Root<"deviceConfigurationTemplate"> model2 = 
cq.from("deviceConfigurationTemplate");
cq.multiselect(model);

这里的问题是你不能将字符串作为参数传递给根对象。我不确定如何创建这样的查询。

1 个答案:

答案 0 :(得分:0)

为什么要尝试传递字符串作为类型参数?加入关联后,生成的JoinPath应使用关联的目标类型进行参数化。

查询是否应该等同于SELECT d.deviceConfigurationTemplate.deviceModel FROM Device d?如果是这样,等效的Criteria查询将是:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<DeviceModel> criteria = cb.createQuery(DeviceModel.class);
Path<DeviceModel> model = criteria.from(Device.class).get("deviceConfigurationTemplate").get("model");
criteria.select(model);

更明确地打字:

CriteriaQuery<DeviceModel> criteria = cb.createQuery(DeviceModel.class);
Root<Device> from = criteria.from(Device.class);
Path<ConfigurationTemplate> configTemplate = from.get("template");
Path<DeviceModel> model = configTemplate.get("model");
criteria.select(model);

您也可以使用from.join()代替。