问题
I'm trying to query a Cassandra table using the IN clause and the @Query annotation from Spring Data. I have a table with a partition key of last_name and a clustering key of first_name.
I have this query working
@Query("SELECT * FROM people WHERE last_name=?0")
public List<People> findByLastName(String lastName);
and I would like to do something like
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN ?1")
public List<People> findByLastName(String lastName, String[] firstName);
I have it working using
CassandraOperations.select("SELECT * FROM people WHERE last_name=" + lastName +
" AND first_name IN (" + concatinatedNameList + ")", People.class);
But for a number of reasons (code style, testing, I swear there are more) I would prefer to use @Query. Any ideas?
EDIT FOR MORE INFO!
Passing in an array, set, or list returns Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract
Also tried:
String firstName = "Joe,Jim";
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)")
public List<People> findByLastName(String lastName, String firstName);
Nothing found, library searches for a single person with a concatinated name ('Joe,Jim')
String firstName = "'Joe','Jim'";
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)")
public List<People> findByLastName(String lastName, String firstName);
Nothing found, the request is escaped and ends up ('''Joe'',''Jim''')
String firstName = "Joe','Jim"; // Hoping the library would just add the outer quotes, getting desperate
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)")
public List<People> findByLastName(String lastName, String firstName);
Nothing found, the request is escaped and ends up ('Joe'',''Jim')
回答1:
Update
With current spring, it seems to be working without braces.
Old answer
You have to use bracers when you are using IN
.
@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)")
public List<People> findByLastName(String lastName, String[] firstName);
But there are some other issues in your code. I changed them all to a good coding standards as below. Including my personal favorite of using named parameters.
@Query("SELECT p FROM People p WHERE p.lastName = :lastName AND p.firstName IN (:firstNames)")
public List<People> findByName(@Param("lastName") String lastName, @Param("firstNames") String[] firstNames);
回答2:
It seems to be not possible!
I checked the source code of spring-data-cassandra-1.3.2.RELEASE.jar.
The allowed data types of parameter in the query method are
String.class, CharSequence.class, char.class, Character.class, char[].class, long.class, Long.class, boolean.class, Boolean.class, BigDecimal.class, BigInteger.class, double.class, Double.class, float.class, Float.class, InetAddress.class, Date.class, UUID.class, int.class are Integer.class
.
They can be found in
org.springframework.data.cassandra.repository.query.CassandraQueryMethod.ALLOWED_PARAMETER_TYPES = Collections.unmodifiableList(Arrays
.asList(new Class<?>[] { String.class, CharSequence.class, char.class, Character.class, char[].class, long.class,
Long.class, boolean.class, Boolean.class, BigDecimal.class, BigInteger.class, double.class, Double.class,
float.class, Float.class, InetAddress.class, Date.class, UUID.class, int.class, Integer.class }));
If we pass data types other than these, then org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(Method method, RepositoryMetadata metadata)
will throw IllegalArgumentException
.
回答3:
Nitish Bhagat is right, with the current version spring-data-cassandra:2.0.6.RELEASE it does NOT work with the braces.
For me, it works ONLY without the braces like:
@Query("SELECT * FROM people WHERE first_name IN ?0")
public List<People> findByFirstName(List<String> firstName);
来源:https://stackoverflow.com/questions/29418075/in-clause-with-spring-data-and-cassandra-query