Java 条件查询:不清晰的结果列表
我有两个小问题。假设我有一个名为MyEntity的实体类。这个类有两种属性。因此,我有两个不同的类Property1和Property2,它们也是实体类。MyEntity和属性类之间存在双向关系,特别是Property1具有属性列表owningEntity,Property2具有属性MyEntity owningEntity。现在我有以下问题:Java 条件查询:不清晰的结果列表,java,sql,jpa-2.0,jpql,criteria-api,Java,Sql,Jpa 2.0,Jpql,Criteria Api,我有两个小问题。假设我有一个名为MyEntity的实体类。这个类有两种属性。因此,我有两个不同的类Property1和Property2,它们也是实体类。MyEntity和属性类之间存在双向关系,特别是Property1具有属性列表owningEntity,Property2具有属性MyEntity owningEntity。现在我有以下问题: SELECT e FROM Property1 p JOIN p.owningEntities e WHERE p.name IN :propertyN
SELECT e FROM Property1 p JOIN p.owningEntities e WHERE p.name IN :propertyNames
此查询返回具有至少一个给定名称的第一种类型属性的所有实体。但总的来说,返回的列表是模糊的。问题是,SELECT在这里不起作用,至少在CriteriaAPI中是这样——我没有在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();
提前谢谢 propertyNames是如何定义的?显然它是一个数组…您应该在SetJoin entity=。。。因为Property1实体定义了列表所有权,并且使用了静态元模型。也许我们应该向我的编译器解释一下,他似乎没有意识到。。。除了笑话,上面的代码没有任何错误。您的观点是,它应该是ListJoin吗?我不知道为什么,但是join方法返回一个SetJoin对象,尽管owningetites是一个列表。与我的编译器相比,你的编译器似乎是个坏蛋,因此我无法重现这个问题。使用SETWITHSETJOIN或List WITHLISTJOIN是首选方法,但我不确定这是否有助于解决此特定错误。是否仍可以从运行时错误粘贴堆栈跟踪?
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