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.
This commit is contained in:
committed by
mikereiche
parent
3a7e9645f7
commit
b3ced12c8c
@@ -586,7 +586,7 @@ public class StringBasedN1qlQueryParser {
|
|||||||
Object[] array = (Object[]) o;
|
Object[] array = (Object[]) o;
|
||||||
JsonArray ja = JsonValue.ja();
|
JsonArray ja = JsonValue.ja();
|
||||||
for (Object e : array) {
|
for (Object e : array) {
|
||||||
ja.add(String.valueOf(couchbaseConverter.convertForWriteIfNeeded(e)));
|
ja.add(couchbaseConverter.convertForWriteIfNeeded(e));
|
||||||
}
|
}
|
||||||
namedValues.put(placeholder, ja);
|
namedValues.put(placeholder, ja);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.springframework.data.couchbase.domain;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonValue;
|
||||||
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
import org.springframework.data.couchbase.repository.Collection;
|
import org.springframework.data.couchbase.repository.Collection;
|
||||||
import org.springframework.data.couchbase.repository.CouchbaseRepository;
|
import org.springframework.data.couchbase.repository.CouchbaseRepository;
|
||||||
@@ -61,6 +62,41 @@ public interface UserRepository extends CouchbaseRepository<User, String> {
|
|||||||
|
|
||||||
List<User> findByIdIsNotNullAndFirstnameEquals(String firstname);
|
List<User> findByIdIsNotNullAndFirstnameEquals(String firstname);
|
||||||
|
|
||||||
|
List<User> findByFirstname(@Param("firstName")FirstName firstName );
|
||||||
|
|
||||||
|
List<User> findByFirstnameIn(@Param("firstNames")FirstName[] firstNames );
|
||||||
|
|
||||||
|
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $firstName)")
|
||||||
|
List<User> queryByFirstnameNamedParameter(@Param("firstName")FirstName firstName );
|
||||||
|
|
||||||
|
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (firstname = $1)")
|
||||||
|
List<User> queryByFirstnamePositionalParameter(@Param("firstName")FirstName firstName );
|
||||||
|
|
||||||
|
enum FirstName {
|
||||||
|
Dave,
|
||||||
|
William
|
||||||
|
}
|
||||||
|
|
||||||
|
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $myNumber)")
|
||||||
|
List<User> queryByIntegerEnumNamed(@Param("myNumber")IntEnum myNumber );
|
||||||
|
|
||||||
|
@Query("#{#n1ql.selectEntity} where #{#n1ql.filter} and (jsonNode.myNumber = $1)")
|
||||||
|
List<User> 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<User> findByVersionEqualsAndFirstnameEquals(Long version, String firstname);
|
List<User> findByVersionEqualsAndFirstnameEquals(Long version, String firstname);
|
||||||
|
|
||||||
@Query("#{#n1ql.selectEntity}|#{#n1ql.filter}|#{#n1ql.bucket}|#{#n1ql.scope}|#{#n1ql.collection}")
|
@Query("#{#n1ql.selectEntity}|#{#n1ql.filter}|#{#n1ql.bucket}|#{#n1ql.scope}|#{#n1ql.collection}")
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ import org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbase
|
|||||||
import org.springframework.data.couchbase.core.query.N1QLExpression;
|
import org.springframework.data.couchbase.core.query.N1QLExpression;
|
||||||
import org.springframework.data.couchbase.core.query.QueryCriteria;
|
import org.springframework.data.couchbase.core.query.QueryCriteria;
|
||||||
import org.springframework.data.couchbase.domain.Address;
|
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.Airline;
|
||||||
|
import org.springframework.data.couchbase.domain.AirlineRepository;
|
||||||
import org.springframework.data.couchbase.domain.Airport;
|
import org.springframework.data.couchbase.domain.Airport;
|
||||||
import org.springframework.data.couchbase.domain.AirportJsonValue;
|
import org.springframework.data.couchbase.domain.AirportJsonValue;
|
||||||
import org.springframework.data.couchbase.domain.AirportJsonValueRepository;
|
import org.springframework.data.couchbase.domain.AirportJsonValueRepository;
|
||||||
@@ -739,6 +739,41 @@ public class CouchbaseRepositoryQueryIntegrationTests extends ClusterAwareIntegr
|
|||||||
userRepository.delete(user);
|
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<User> foundUsersEquals = userRepository.findByFirstname(UserRepository.FirstName.Dave);
|
||||||
|
assertEquals(user.getId(), foundUsersEquals.get(0).getId());
|
||||||
|
assertEquals(1, foundUsersEquals.size());
|
||||||
|
|
||||||
|
List<User> foundUsersIn = userRepository.findByFirstnameIn( new UserRepository.FirstName[]{ UserRepository.FirstName.Dave });
|
||||||
|
assertEquals(user.getId(), foundUsersIn.get(0).getId());
|
||||||
|
assertEquals(1, foundUsersIn.size());
|
||||||
|
|
||||||
|
List<User> namedUsers = userRepository.queryByFirstnameNamedParameter( UserRepository.FirstName.Dave);
|
||||||
|
assertEquals(user.getId(), namedUsers.get(0).getId());
|
||||||
|
assertEquals(1, namedUsers.size());
|
||||||
|
|
||||||
|
List<User> 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<User> integerEnumUsersNamed = userRepository.queryByIntegerEnumNamed(UserRepository.IntEnum.OneThousand);
|
||||||
|
assertEquals(2, integerEnumUsersNamed.size());
|
||||||
|
|
||||||
|
// User objects are initialized with jsonNode.myNumber = 1000
|
||||||
|
List<User> integerEnumUsersPositional = userRepository.queryByIntegerEnumPositional(UserRepository.IntEnum.OneThousand);
|
||||||
|
assertEquals(2, integerEnumUsersPositional.size());
|
||||||
|
|
||||||
|
userRepository.delete(user);
|
||||||
|
userRepository.delete(user2);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCas() {
|
public void testCas() {
|
||||||
User user = new User("1", "Dave", "Wilson");
|
User user = new User("1", "Dave", "Wilson");
|
||||||
|
|||||||
Reference in New Issue
Block a user