2015-04-02 20 views
8

Tôi đang cố gắng truy vấn một bảng Cassandra bằng mệnh đề IN và chú thích @Query từ Dữ liệu Mùa xuân. Tôi có một bảng với một khóa phân vùng của last_name và một khóa phân nhóm của first_name.IN với Dữ liệu Mùa xuân và Cassandra @Query

Tôi có truy vấn này làm việc

@Query("SELECT * FROM people WHERE last_name=?0") 
public List<People> findByLastName(String lastName); 

và tôi muốn làm một cái gì đó giống như

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN ?1") 
public List<People> findByLastName(String lastName, String[] firstName); 

Tôi có nó làm việc sử dụng

CassandraOperations.select("SELECT * FROM people WHERE last_name=" + lastName + 
" AND first_name IN (" + concatinatedNameList + ")", People.class); 

Nhưng đối với một số lý do (mã phong cách, thử nghiệm, tôi thề có nhiều hơn) Tôi muốn sử dụng @Query. Bất kỳ ý tưởng?

CHỈNH SỬA ĐỂ BIẾT THÊM THÔNG TIN!

Đi qua trong một mảng, thiết lập, hoặc danh sách trả Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract

Cũng thử:

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); 

Không tìm thấy gì, tìm kiếm thư viện cho một người duy nhất với một tên concatinated ('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); 

Không tìm thấy gì, yêu cầu được thoát và kết thúc ('''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); 

Không tìm thấy gì, yêu cầu được thoát và kết thúc lên ('Joe'',''Jim')

+1

bạn có thử bất kỳ loại Bộ sưu tập nào không? Đặt hoặc Danh sách các chuỗi thay vì mảng Chuỗi? –

+0

Cả hai Danh sách và Bộ trả về lỗi tương tự như vậy khi khởi động 'Nguyên nhân bởi: java.lang.IllegalArgumentException: gặp phải kiểu tham số truy vấn không được hỗ trợ [interface java.util.Set] ' –

Trả lời

8

Bạn phải sử dụng Bracers khi bạn đang sử dụng IN.

@Query("SELECT * FROM people WHERE last_name=?0 AND first_name IN (?1)") 
public List<People> findByLastName(String lastName, String[] firstName); 

Nhưng có một số vấn đề khác trong mã của bạn. Tôi đã thay đổi tất cả thành một tiêu chuẩn mã hóa tốt như sau. Bao gồm cả yêu thích cá nhân của tôi về việc sử dụng các tham số có tên.

@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); 
+0

Tôi ước mình có thể sử dụng các tham số có tên, nhưng vì tôi thực sự đang đi qua 7, tôi kết thúc với' Invalid exception of bind variable' exception. Tôi có thể làm cho nó hoạt động khi đi qua một chuỗi duy nhất để hạn chế, nhưng khi đi qua một mảng tôi thấy điều này khi khởi động 'Gây ra bởi: java.lang.IllegalArgumentException: gặp phải kiểu tham số truy vấn không được hỗ trợ [class [Ljava .lang.String;] ' –

+1

Sau đó, bạn có thể thử cái đầu tiên. cùng một truy vấn với bracets. Giống như 'IN (? 1)' –

+0

Nếu tôi chuyển một tên, nó sẽ hoạt động. Nếu tôi vượt qua nhiều, nó được gói trong dấu ngoặc kép để truy vấn kết thúc lên 'IN ('Joe, Jim')'. Rõ ràng, không ai được đặt tên là 'Joe, Jim'. Tôi cũng đã cố gắng xây dựng một chuỗi yêu cầu, '' Joe ',' Jim'' nhưng khi nó được thông qua trong thư viện thoát khỏi tất cả các dấu ngoặc kép và tôi kết thúc bằng '' '' Joe '', '' '' Jim '' '' –

2

Có vẻ như không thể thực hiện được!

Tôi đã kiểm tra mã nguồn của spring-data-cassandra-1.3.2.RELEASE.jar.

Các loại dữ liệu được phép tham số trong phương thức truy vấn là 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.

Họ có thể được tìm thấy trong

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 })); 

Nếu chúng ta vượt qua các kiểu dữ liệu khác hơn này, sau đó org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(Method method, RepositoryMetadata metadata) sẽ ném IllegalArgumentException.

Các vấn đề liên quan