我有两个小问题。假设我有一个名为MyEntity
的实体类。这个类有两种属性。因此,我有两个不同的类Property1
和Property2
,它们也是实体类。 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
提前致谢!