Skip to content

Commit fca506f

Browse files
committed
Don't use String version of enum parameters. (#1846)
Just use the converted value as-is (in case of boolean or Number) enum value. Closes #1837.
1 parent 7283a5c commit fca506f

File tree

3 files changed

+73
-2
lines changed

3 files changed

+73
-2
lines changed

src/main/java/org/springframework/data/couchbase/repository/query/StringBasedN1qlQueryParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ private void addAsArray(JsonObject namedValues, String placeholder, Object o) {
586586
Object[] array = (Object[]) o;
587587
JsonArray ja = JsonValue.ja();
588588
for (Object e : array) {
589-
ja.add(String.valueOf(couchbaseConverter.convertForWriteIfNeeded(e)));
589+
ja.add(couchbaseConverter.convertForWriteIfNeeded(e));
590590
}
591591
namedValues.put(placeholder, ja);
592592
}

src/test/java/org/springframework/data/couchbase/domain/UserRepository.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.List;
2020
import java.util.stream.Stream;
2121

22+
import com.fasterxml.jackson.annotation.JsonValue;
2223
import org.springframework.cache.annotation.Cacheable;
2324
import org.springframework.data.couchbase.repository.Collection;
2425
import org.springframework.data.couchbase.repository.CouchbaseRepository;
@@ -61,6 +62,41 @@ public interface UserRepository extends CouchbaseRepository<User, String> {
6162

6263
List<User> findByIdIsNotNullAndFirstnameEquals(String firstname);
6364

65+
List<User> findByFirstname(@Param("firstName")FirstName firstName );
66+
67+
List<User> findByFirstnameIn(@Param("firstNames")FirstName[] firstNames );
68+
69+
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $firstName)")
70+
List<User> queryByFirstnameNamedParameter(@Param("firstName")FirstName firstName );
71+
72+
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $1)")
73+
List<User> queryByFirstnamePositionalParameter(@Param("firstName")FirstName firstName );
74+
75+
enum FirstName {
76+
Dave,
77+
William
78+
}
79+
80+
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $myNumber)")
81+
List<User> queryByIntegerEnumNamed(@Param("myNumber")IntEnum myNumber );
82+
83+
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $1)")
84+
List<User> queryByIntegerEnumPositional(@Param("myNumber")IntEnum myNumber );
85+
86+
enum IntEnum {
87+
One(1),
88+
Two(2),
89+
OneThousand(1000);
90+
Integer value;
91+
IntEnum(Integer i){
92+
value = i;
93+
}
94+
@JsonValue
95+
public Integer getValue(){
96+
return value;
97+
}
98+
}
99+
64100
List<User> findByVersionEqualsAndFirstnameEquals(Long version, String firstname);
65101

66102
@Query("#{#n1ql.selectEntity}|#{#n1ql.filter}|#{#n1ql.bucket}|#{#n1ql.scope}|#{#n1ql.collection}")

src/test/java/org/springframework/data/couchbase/repository/CouchbaseRepositoryQueryIntegrationTests.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@
6666
import org.springframework.data.couchbase.core.query.N1QLExpression;
6767
import org.springframework.data.couchbase.core.query.QueryCriteria;
6868
import org.springframework.data.couchbase.domain.Address;
69-
import org.springframework.data.couchbase.domain.AirlineRepository;
7069
import org.springframework.data.couchbase.domain.Airline;
70+
import org.springframework.data.couchbase.domain.AirlineRepository;
7171
import org.springframework.data.couchbase.domain.Airport;
7272
import org.springframework.data.couchbase.domain.AirportJsonValue;
7373
import org.springframework.data.couchbase.domain.AirportJsonValueRepository;
@@ -741,6 +741,41 @@ public void testTransient() {
741741
userRepository.delete(user);
742742
}
743743

744+
@Test
745+
public void testEnumParameter() {
746+
User user = new User("1", "Dave", "Wilson");
747+
userRepository.save(user);
748+
User user2 = new User("2", "Frank", "Spalding");
749+
userRepository.save(user2);
750+
751+
List<User> foundUsersEquals = userRepository.findByFirstname(UserRepository.FirstName.Dave);
752+
assertEquals(user.getId(), foundUsersEquals.get(0).getId());
753+
assertEquals(1, foundUsersEquals.size());
754+
755+
List<User> foundUsersIn = userRepository.findByFirstnameIn( new UserRepository.FirstName[]{ UserRepository.FirstName.Dave });
756+
assertEquals(user.getId(), foundUsersIn.get(0).getId());
757+
assertEquals(1, foundUsersIn.size());
758+
759+
List<User> namedUsers = userRepository.queryByFirstnameNamedParameter( UserRepository.FirstName.Dave);
760+
assertEquals(user.getId(), namedUsers.get(0).getId());
761+
assertEquals(1, namedUsers.size());
762+
763+
List<User> positionalUsers = userRepository.queryByFirstnamePositionalParameter( UserRepository.FirstName.Dave);
764+
assertEquals(user.getId(), positionalUsers.get(0).getId());
765+
assertEquals(1, positionalUsers.size());
766+
767+
// User objects are initialized with jsonNode.myNumber = 1000
768+
List<User> integerEnumUsersNamed = userRepository.queryByIntegerEnumNamed(UserRepository.IntEnum.OneThousand);
769+
assertEquals(2, integerEnumUsersNamed.size());
770+
771+
// User objects are initialized with jsonNode.myNumber = 1000
772+
List<User> integerEnumUsersPositional = userRepository.queryByIntegerEnumPositional(UserRepository.IntEnum.OneThousand);
773+
assertEquals(2, integerEnumUsersPositional.size());
774+
775+
userRepository.delete(user);
776+
userRepository.delete(user2);
777+
}
778+
744779
@Test
745780
public void testCas() {
746781
User user = new User("1", "Dave", "Wilson");

0 commit comments

Comments
 (0)