是否有可能(如果是这样的话)创建一个条件查询,该查询导致一个元组或数组,其中某些元素是来自集合值属性的集合?
鉴于实体Dummy
的{{1}}名称为List<SubEntities>
subs
我想要一个标准API查询,这会导致结构
元组&GT;
class Dummy {
String name;
List<SubEntity> subs;
}
class SubEntity {
// some attributes
}
而不是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();
中包含的Object[]
作为第二个元素list
而不是SubEntity
。
这个失败的方式相同:
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();
根本不起作用并导致一个无效的SQL语句,其中一个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();
作为一个选择列(至少对于Hibernate和HSQLDB而言)。
问题How can I retrieve a collection property using criteria Api似乎表明它不可能,但它基于Hibernate,我想得到一个基于JPA的答案。特别是一个答案指出了JPA规范中明确表示不可能的部分,我们将不胜感激。
答案 0 :(得分: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中无法选择多值表达式。
Criteria只是一种使用API和对象创建查询的方法。参见JPA规范第6.1章:
标准查询的语义旨在反映Java Persistence查询的语义 语言查询。
因此,假设相同的约束适用于Criteria API是合理的。