From aaf3e95d08fbb1a8336f93cbca7574a8b7d05add Mon Sep 17 00:00:00 2001 From: Lai Jiang Date: Wed, 7 Jul 2021 15:49:29 -0400 Subject: [PATCH] Add a method to set a "not in" WHERE clause in CriteriaQueryBuilder (#1225) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change is [Reviewable](https://reviewable.io/reviews/google/nomulus/1225) --- .../transaction/CriteriaQueryBuilder.java | 7 +++++++ .../transaction/CriteriaQueryBuilderTest.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/core/src/main/java/google/registry/persistence/transaction/CriteriaQueryBuilder.java b/core/src/main/java/google/registry/persistence/transaction/CriteriaQueryBuilder.java index 9befbfab5..ead9869d6 100644 --- a/core/src/main/java/google/registry/persistence/transaction/CriteriaQueryBuilder.java +++ b/core/src/main/java/google/registry/persistence/transaction/CriteriaQueryBuilder.java @@ -62,6 +62,13 @@ public class CriteriaQueryBuilder { return where(root.get(fieldName).in(values)); } + /** + * Adds a WHERE clause to the query specifying that a value must not be in the given collection. + */ + public CriteriaQueryBuilder whereFieldIsNotIn(String fieldName, Collection values) { + return where(root.get(fieldName).in(values).not()); + } + /** * Adds a WHERE clause to the query specifying that a collection field must contain a particular * value. diff --git a/core/src/test/java/google/registry/persistence/transaction/CriteriaQueryBuilderTest.java b/core/src/test/java/google/registry/persistence/transaction/CriteriaQueryBuilderTest.java index e2ea4a339..f06d7a9cd 100644 --- a/core/src/test/java/google/registry/persistence/transaction/CriteriaQueryBuilderTest.java +++ b/core/src/test/java/google/registry/persistence/transaction/CriteriaQueryBuilderTest.java @@ -152,6 +152,21 @@ class CriteriaQueryBuilderTest { assertThat(result).containsExactly(entity3).inOrder(); } + @Test + void testSuccess_where_not_in_twoResults() { + List result = + jpaTm() + .transact( + () -> { + CriteriaQuery query = + CriteriaQueryBuilder.create(CriteriaQueryBuilderTestEntity.class) + .whereFieldIsNotIn("data", ImmutableList.of("aaa", "bbb")) + .build(); + return jpaTm().query(query).getResultList(); + }); + assertThat(result).containsExactly(entity1, entity2).inOrder(); + } + @Test void testSuccess_where_in_twoResults() { List result =