包含集合值属性

时间:2017-09-14 08:44:07

标签: jpa criteria-api

是否有可能(如果是这样的话)创建一个条件查询,该查询导致一个元组或数组,其中某些元素是来自集合值属性的集合?

鉴于实体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规范中明确表示不可能的部分,我们将不胜感激。

1 个答案:

答案 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是合理的。