【发布时间】:2017-09-14 08:44:07
【问题描述】:
是否可以(如果可以的话)创建一个条件查询,该条件查询会产生一个元组或数组,其中一些元素是来自集合值属性的集合?
给定一个实体Dummy,它有一个List<SubEntities>,名称为subs
class Dummy {
String name;
List<SubEntity> subs;
}
class SubEntity {
// some attributes
}
我想要一个标准 API 查询,它会产生具有结构的东西
元组>
Array 代替 Tuple 就可以了,Array 相同,List 类似。
我尝试了以下方法:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> q = cb.createQuery(Object[].class);
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class);
Join<Object, Object> subs = root.join("subs");
q.select(cb.array(root.get("name"), subs));
List<Object[]> list = em.createQuery(q).getResultList();
但是list 中包含的Object[]s 的第二个元素是SubEntitys 而不是List<SubEntity>。
这个同样失败:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class);
Join<Object, Object> subs = root.join("subs");
q.multiselect(root.get("name"), subs);
List<Tuple> list = em.createQuery(q).getResultList();
这个变种
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object[]> q = cb.createQuery(Object[].class);
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class);
q.select(cb.array(root.get("name"), root.get("subs")));
List<Object[]> list = em.createQuery(q).getResultList();
根本不起作用,并导致一个无效的 SQL 语句,将单个 . 作为一个选择列(至少对于 Hibernate 和 HSQLDB)。
How can I retrieve a collection property using criteria Api 的问题似乎表明这是不可能的,但它是基于 Hibernate 的,我想得到一个基于 JPA 的答案。特别是指出 JPA 规范中明确指出这是不可能的部分的答案将不胜感激。
【问题讨论】:
标签: jpa criteria-api