0

我要更改的休眠条件查询如下所示

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);

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

4

1 回答 1

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()改用。

于 2018-03-30T17:26:37.320 回答