From 42b60cf8d4e39030d2fb9ea5078e5bb3818a4624 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 5 Dec 2011 14:38:39 +0100 Subject: [PATCH] DATAJPA-132 - Implemented handling of True and False keywords on query creation. Query derivation mechanism now supports True and False as keywords in finder methods: class User { boolean active; } interface UserRepository { List findByActiveTrue() ; } --- src/docbkx/reference/jpa.xml | 16 ++++++++++ .../jpa/repository/query/JpaQueryCreator.java | 7 +++-- .../data/jpa/domain/sample/User.java | 16 ++++++++++ .../jpa/repository/UserRepositoryTests.java | 30 +++++++++++++++++++ .../jpa/repository/sample/UserRepository.java | 10 +++++++ 5 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/docbkx/reference/jpa.xml b/src/docbkx/reference/jpa.xml index 2b358f0fa..c23aa4460 100644 --- a/src/docbkx/reference/jpa.xml +++ b/src/docbkx/reference/jpa.xml @@ -271,6 +271,22 @@ … where x.age not in ?1 + + + True + + findByActiveTrue() + + … where x.active = true + + + + False + + findByActiveFalse() + + … where x.active = false + diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index 0b9919b7f..76a085965 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -176,8 +176,7 @@ public class JpaQueryCreator extends AbstractQueryCreator, return getTypedPath(root, part, Comparable.class); } - private Expression getTypedPath(Root root, Part part, Class type) { - + private Expression getTypedPath(Root root, Part part, Class type) { return toExpressionRecursively(root, part.getProperty()); } @@ -326,6 +325,10 @@ public class JpaQueryCreator extends AbstractQueryCreator, Expression parameterExpression = upperIfIgnoreCase(provider.next(String.class)); Predicate like = builder.like(propertyExpression, parameterExpression); return part.getType() == Type.LIKE ? like : like.not(); + case TRUE: + return builder.isTrue(getTypedPath(root, part, Boolean.class)); + case FALSE: + return builder.isFalse(getTypedPath(root, part, Boolean.class)); case SIMPLE_PROPERTY: return builder.equal(upperIfIgnoreCase(path), upperIfIgnoreCase(provider.next())); case NEGATING_SIMPLE_PROPERTY: diff --git a/src/test/java/org/springframework/data/jpa/domain/sample/User.java b/src/test/java/org/springframework/data/jpa/domain/sample/User.java index f8d54e688..e3c886e50 100644 --- a/src/test/java/org/springframework/data/jpa/domain/sample/User.java +++ b/src/test/java/org/springframework/data/jpa/domain/sample/User.java @@ -46,6 +46,7 @@ public class User { private String firstname; private String lastname; private int age; + private boolean active; @Column(nullable = false, unique = true) private String emailAddress; @@ -81,6 +82,7 @@ public class User { this.firstname = firstname; this.lastname = lastname; this.emailAddress = emailAddress; + this.active = true; } /** @@ -173,6 +175,20 @@ public class User { this.emailAddress = emailAddress; } + /** + * @param active the active to set + */ + public void setActive(boolean active) { + this.active = active; + } + + /** + * @return the active + */ + public boolean isActive() { + return active; + } + /** * Returns the user's roles. * diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index bace1e149..a399d31d4 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -694,6 +694,36 @@ public class UserRepositoryTests { assertThat(result.size(), is(1)); } + /** + * @see DATAJPA-132 + */ + @Test + public void executesFinderWithTrueKeywordCorrectly() { + + flushTestUsers(); + firstUser.setActive(false); + repository.save(firstUser); + + List result = repository.findByActiveTrue(); + assertThat(result.size(), is(2)); + assertThat(result, hasItems(secondUser, thirdUser)); + } + + /** + * @see DATAJPA-132 + */ + @Test + public void executesFinderWithFalseKeywordCorrectly() { + + flushTestUsers(); + firstUser.setActive(false); + repository.save(firstUser); + + List result = repository.findByActiveFalse(); + assertThat(result.size(), is(1)); + assertThat(result, hasItem(firstUser)); + } + private void flushTestUsers() { firstUser = repository.save(firstUser); diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index d12ef9cb6..4f310f930 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -197,4 +197,14 @@ public interface UserRepository extends JpaRepository, JpaSpecifi */ @Query(value = "SELECT * FROM User WHERE lastname = ?1", nativeQuery = true) List findNativeByLastname(String lastname); + + /** + * @see DATAJPA-132 + */ + List findByActiveTrue(); + + /** + * @see DATAJPA-132 + */ + List findByActiveFalse(); }