条件查询:隐隐绰绰的结果列表

时间:2014-10-07 13:48:21

标签: java sql jpa-2.0 jpql criteria-api

我有两个小问题。假设我有一个名为MyEntity的实体类。这个类有两种属性。因此,我有两个不同的类Property1Property2,它们也是实体类。 MyEntity与属性类之间存在双向关系,尤其是Property1具有属性List<MyEntity> owningEntities,而Property2具有属性MyEntity owningEntity。现在我有以下查询:

SELECT e FROM Property1 p JOIN p.owningEntities e WHERE p.name IN :propertyNames  

此查询返回具有至少一个给定名称的第一个类型属性的所有实体。但总的来说,返回的列表是模糊的。问题是SELECT DISTINCT在这里不起作用,至少使用标准API - 我没有尝试使用jpql。条件查询的代码如下所示:

CriteriaQuery<MyEntity> cq = cb.createQuery(MyEntity.class);
Root<Property1> property = cq.from(Property1.class);
SetJoin<Property1, MyEntity> entity =
                property.join(Property1_.owningEntities);
cq.where(property.get(Property1_.name).in((Object[]) propertyNames));
cq.select(entity);
// cq.select(entity).distinct(true); --> runtime error
List<MyEntity> resultList = em.createQuery(cq).getResultList();

有没有办法获得干扰结果列表?我可以简单地将列表转换为集合,但是多次提取相同的结果似乎无效。

下一个问题是,我当然希望所有具有任何类型属性的实体至少具有一个给定名称。到目前为止,我有两个查询,之后我合并了结果。但我再次多次提取许多结果。那么,有没有办法以有效的方式结合以下两个查询?

SELECT e FROM Property1 p JOIN p.owningEntities e WHERE p.name IN :propertyNames  
SELECT e FROM Property2 p JOIN p.owningEntity e WHERE p.name IN :propertyNames  

提前致谢!

0 个答案:

没有答案