包含集合值属性的条件查询

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 的第二个元素是SubEntitys 而不是List&lt;SubEntity&gt;

这个同样失败:

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

【讨论】:

感谢您的指点。我添加了一些明确的引用和链接。

以上是关于包含集合值属性的条件查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis Example条件查询

Django学习 Day8

如何在 DynamoDB 中的单个属性上查询(getItems)两个条件(不存在 + 某个值)?

hibernate用HQL查询集合属性

外连接查询

返回的对象具有符合 Mongoose 条件的嵌套值