Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
JPA CriteriaBuilder-不在集合中_Jpa_Collections_Where - Fatal编程技术网

JPA CriteriaBuilder-不在集合中

JPA CriteriaBuilder-不在集合中,jpa,collections,where,Jpa,Collections,Where,以下两者之间的区别是什么: 构建器上的第一次测试运行: Predicate predicate = root.get(PersonEntity_.name).in(names); criteriaBuilder.not(predicate); 对查询进行第二次测试运行: Predicate predicate2 = root.get(PersonEntity_.name).in(names).not(); criteriaQuery.where(predicate2); 这似乎给出了相同的结

以下两者之间的区别是什么:

构建器上的第一次测试运行:

Predicate predicate = root.get(PersonEntity_.name).in(names);
criteriaBuilder.not(predicate);
对查询进行第二次测试运行:

Predicate predicate2 = root.get(PersonEntity_.name).in(names).not();
criteriaQuery.where(predicate2);
这似乎给出了相同的结果。我错过什么了吗我们应该选择CriteriaQuery上方的CriteriaBuilder吗?

完整示例:

List<String> names = new ArrayList<String>();
names.add("John");
names.add("Emma");

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<PersonEntity> criteriaQuery = criteriaBuilder.createQuery(PersonEntity.class);
Root<PersonEntity> root = criteriaQuery.from(PersonEntity.class);

// First test run on the Builder
Predicate predicate = root.get(PersonEntity_.name).in(names);
criteriaBuilder.not(predicate);

  // Second test run the query
List name=new ArrayList();
姓名。添加(“约翰”);
名称。添加(“Emma”);
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=criteriaBuilder.createQuery(PersonEntity.class);
Root=criteriaQuery.from(PersonEntity.class);
//构建器上的第一次测试运行
谓词谓词=根.get(PersonEntity_uu.name).in(names);
criteriaBuilder.not(谓词);
//第二个测试运行查询
//谓词predicate2=root.get(PersonEntity_uuz.name).in(names).not(); //criteriaQuery.where(谓词2)

List List=entityManager.createQuery(cq.getResultList();

这些变体之间没有区别。两种说法的结果相同。

我不明白。criteriaBuilder.not(谓词)和predicate.not()都返回一个新的谓词,并且是等效的。但是,除非调用criteriaQuery.where(谓词2),否则都不应该添加到查询中。我已经更新了示例:它们不会一起运行,而是放在注释中,然后单独运行。但是正如我提到的,criteriaBuilder.not(谓词)和predicate.not()都应该按照规范返回谓词。请与您的JPA提供商联系,看看这是否是一个bug,因为我认为criteriaBuilder.not(谓词)不应该更改查询。您必须以某种方式将结果谓词与查询相关联,以便JPA可移植。
List<PersonEntity> list = entityManager.createQuery(cq).getResultList();