10

IN 句と Spring Data の @Query アノテーションを使用して、Cassandra テーブルをクエリしようとしています。last_name のパーティション キーと first_name のクラスタリング キーを持つテーブルがあります。

このクエリが機能しています

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

そして、私は次のようなことをしたいと思います

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

私はそれを使って働いています

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

しかし、いくつかの理由 (コード スタイル、テスト、他にもあることを誓います) から、@Query を使用したいと思います。何か案は?

詳細については編集してください。

配列、セット、またはリストの戻り値を渡すCaused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract

また試しました:

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

何も見つかりませんでした。ライブラリは、連結された名前を持つ 1 人の人物を検索します('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);

何も見つかりませんでした。リクエストはエスケープされて終了します('''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);

何も見つかりませんでした。リクエストはエスケープされて終了します('Joe'',''Jim')

4

3 に答える 3

10

アップデート

現在の春では、ブレースなしで機能しているようです。


古い答え

を使用している場合は、ブレーサーを使用する必要がありますIN

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

ただし、コードには他にもいくつかの問題があります。以下のように、それらをすべて適切なコーディング標準に変更しました。名前付きパラメーターを使用する私の個人的なお気に入りを含めます。

@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);
于 2015-04-03T16:01:17.770 に答える