복붙노트

[SPRING] Spring 데이터와 Cassandra를 이용한 IN 절 @Query

SPRING

Spring 데이터와 Cassandra를 이용한 IN 절 @Query

IN 절과 Spring 데이터의 @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를 사용하는 것을 선호합니다. 어떤 아이디어?

더 많은 정보를 편집하십시오!

배열, 세트 또는리스트를 건네주는 것이 원인 : java.lang.IllegalArgumentException : 지원되지 않는 쿼리 매개 변수 유형이 발생했습니다. public class abstract [Ljava.lang.String;]

또한 시도 :

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

아무것도 발견되지 않음, 라이브러리는 연결된 이름을 가진 한 사람을 검색합니다 ( '조, 짐').

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

아무것도 찾지 못했습니다. 요청이 이스케이프 처리되고 끝납니다 ( '' '조' ',' '짐' '').

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').

해결법

  1. ==============================

    1.최신 정보

    최신 정보

    현재 봄에는 중괄호없이 작동하는 것 같습니다.

    이전 답변

    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);
    
  2. ==============================

    2.가능하지 않은 것 같습니다!

    가능하지 않은 것 같습니다!

    나는 spring-data-cassandra-1.3.2.RELEASE.jar의 소스 코드를 확인했다.

    쿼리 메서드에서 허용되는 데이터 형식의 매개 변수는 다음과 같습니다. 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입니다.

    그들은에서 찾을 수 있습니다

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

    이것 이외의 데이터 형을 건네 주면 (자), org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify (Method 메소드, RepositoryMetadata 메타 데이타)가 IllegalArgumentException를 throw합니다.

  3. ==============================

    3.Nitish Bhagat이 맞습니다. 현재 버전의 spring-data-cassandra : 2.0.6.RELEASE는 중괄호로는 작동하지 않습니다.

    Nitish Bhagat이 맞습니다. 현재 버전의 spring-data-cassandra : 2.0.6.RELEASE는 중괄호로는 작동하지 않습니다.

    나를 위해, 그것은 다음과 같은 중괄호없이 작동합니다 : @Query ( "SELECT * FROM people first_name IN? 0") 공용 목록 findByFirstName (List firstName);

  4. from https://stackoverflow.com/questions/29418075/in-clause-with-spring-data-and-cassandra-query by cc-by-sa and MIT license