Skip to content

Commit afaf2ec

Browse files
authored
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 247164c commit afaf2ec

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

+1-1
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

+36
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

+36-1
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@
6565
import org.springframework.data.couchbase.core.query.N1QLExpression;
6666
import org.springframework.data.couchbase.core.query.QueryCriteria;
6767
import org.springframework.data.couchbase.domain.Address;
68-
import org.springframework.data.couchbase.domain.AirlineRepository;
6968
import org.springframework.data.couchbase.domain.Airline;
69+
import org.springframework.data.couchbase.domain.AirlineRepository;
7070
import org.springframework.data.couchbase.domain.Airport;
7171
import org.springframework.data.couchbase.domain.AirportJsonValue;
7272
import org.springframework.data.couchbase.domain.AirportJsonValueRepository;
@@ -739,6 +739,41 @@ public void testTransient() {
739739
userRepository.delete(user);
740740
}
741741

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

0 commit comments

Comments
 (0)