Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 条件查询:不清晰的结果列表_Java_Sql_Jpa 2.0_Jpql_Criteria Api - Fatal编程技术网

Java 条件查询:不清晰的结果列表

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

我有两个小问题。假设我有一个名为MyEntity的实体类。这个类有两种属性。因此,我有两个不同的类Property1和Property2,它们也是实体类。MyEntity和属性类之间存在双向关系,特别是Property1具有属性列表owningEntity,Property2具有属性MyEntity owningEntity。现在我有以下问题:

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