首页 文章

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

提问于
浏览
0

我试图改变的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

    为什么要尝试传递字符串作为类型参数?一旦你加入一个关联,结果 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() 代替 .

相关问题