包含集合值属性的条件查询
Posted
技术标签:
【中文标题】包含集合值属性的条件查询【英文标题】:Criteria query containing a collection valued property 【发布时间】: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 的第二个元素是SubEntity
s 而不是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 规范中明确指出这是不可能的部分的答案将不胜感激。
【问题讨论】:
【参考方案1】:JPQL defines第4.8节中的select子句为
select_clause ::= SELECT [DISTINCT] select_item , select_item*
select_item ::= select_expression [[AS] result_variable]
select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression
因此您可以看到多值表达式在 JPQL 中是不可选的。
条件只是一种使用 API 和对象创建查询的方法。请参阅 JPA 规范第 6.1 章:
标准查询的语义旨在反映 Java Persistence 查询的语义 语言查询。
因此假设相同的约束适用于 Criteria API 是合理的。
【讨论】:
感谢您的指点。我添加了一些明确的引用和链接。以上是关于包含集合值属性的条件查询的主要内容,如果未能解决你的问题,请参考以下文章