diff --git a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java index 773290772..497543613 100644 --- a/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java +++ b/src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java @@ -586,7 +586,7 @@ private void addAsArray(JsonObject namedValues, String placeholder, Object o) { Object[] array = (Object[]) o; JsonArray ja = JsonValue.ja(); for (Object e : array) { - ja.add(String.valueOf(couchbaseConverter.convertForWriteIfNeeded(e))); + ja.add(couchbaseConverter.convertForWriteIfNeeded(e)); } namedValues.put(placeholder, ja); } diff --git a/src/test/java/org/springframework/data/couchbase/domain/UserRepository.java b/src/test/java/org/springframework/data/couchbase/domain/UserRepository.java index 79f20da4f..71066dcce 100644 --- a/src/test/java/org/springframework/data/couchbase/domain/UserRepository.java +++ b/src/test/java/org/springframework/data/couchbase/domain/UserRepository.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.stream.Stream; +import com.fasterxml.jackson.annotation.JsonValue; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.couchbase.repository.Collection; import org.springframework.data.couchbase.repository.CouchbaseRepository; @@ -61,6 +62,41 @@ public interface UserRepository extends CouchbaseRepository { List findByIdIsNotNullAndFirstnameEquals(String firstname); + List findByFirstname(@Param("firstName")FirstName firstName ); + + List findByFirstnameIn(@Param("firstNames")FirstName[] firstNames ); + + @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $firstName)") + List queryByFirstnameNamedParameter(@Param("firstName")FirstName firstName ); + + @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $1)") + List queryByFirstnamePositionalParameter(@Param("firstName")FirstName firstName ); + + enum FirstName { + Dave, + William + } + + @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $myNumber)") + List queryByIntegerEnumNamed(@Param("myNumber")IntEnum myNumber ); + + @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $1)") + List queryByIntegerEnumPositional(@Param("myNumber")IntEnum myNumber ); + + enum IntEnum { + One(1), + Two(2), + OneThousand(1000); + Integer value; + IntEnum(Integer i){ + value = i; + } + @JsonValue + public Integer getValue(){ + return value; + } + } + List findByVersionEqualsAndFirstnameEquals(Long version, String firstname); @Query("#{#n1ql.selectEntity}|#{#n1ql.filter}|#{#n1ql.bucket}|#{#n1ql.scope}|#{#n1ql.collection}") diff --git a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java index 385569011..c86acdaab 100644 --- a/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java @@ -65,8 +65,8 @@ import org.springframework.data.couchbase.core.query.N1QLExpression; import org.springframework.data.couchbase.core.query.QueryCriteria; import org.springframework.data.couchbase.domain.Address; -import org.springframework.data.couchbase.domain.AirlineRepository; import org.springframework.data.couchbase.domain.Airline; +import org.springframework.data.couchbase.domain.AirlineRepository; import org.springframework.data.couchbase.domain.Airport; import org.springframework.data.couchbase.domain.AirportJsonValue; import org.springframework.data.couchbase.domain.AirportJsonValueRepository; @@ -739,6 +739,41 @@ public void testTransient() { userRepository.delete(user); } + @Test + public void testEnumParameter() { + User user = new User("1", "Dave", "Wilson"); + userRepository.save(user); + User user2 = new User("2", "Frank", "Spalding"); + userRepository.save(user2); + + List foundUsersEquals = userRepository.findByFirstname(UserRepository.FirstName.Dave); + assertEquals(user.getId(), foundUsersEquals.get(0).getId()); + assertEquals(1, foundUsersEquals.size()); + + List foundUsersIn = userRepository.findByFirstnameIn( new UserRepository.FirstName[]{ UserRepository.FirstName.Dave }); + assertEquals(user.getId(), foundUsersIn.get(0).getId()); + assertEquals(1, foundUsersIn.size()); + + List namedUsers = userRepository.queryByFirstnameNamedParameter( UserRepository.FirstName.Dave); + assertEquals(user.getId(), namedUsers.get(0).getId()); + assertEquals(1, namedUsers.size()); + + List positionalUsers = userRepository.queryByFirstnamePositionalParameter( UserRepository.FirstName.Dave); + assertEquals(user.getId(), positionalUsers.get(0).getId()); + assertEquals(1, positionalUsers.size()); + + // User objects are initialized with jsonNode.myNumber = 1000 + List integerEnumUsersNamed = userRepository.queryByIntegerEnumNamed(UserRepository.IntEnum.OneThousand); + assertEquals(2, integerEnumUsersNamed.size()); + + // User objects are initialized with jsonNode.myNumber = 1000 + List integerEnumUsersPositional = userRepository.queryByIntegerEnumPositional(UserRepository.IntEnum.OneThousand); + assertEquals(2, integerEnumUsersPositional.size()); + + userRepository.delete(user); + userRepository.delete(user2); + } + @Test public void testCas() { User user = new User("1", "Dave", "Wilson");