2015-04-02 9 views
8

Sto provando a interrogare una tabella Cassandra usando la clausola IN e l'annotazione @Query da Spring Data. Ho una tabella con una chiave di partizione di last_name e una chiave di clustering di first_name.clausola IN con Spring Data e Cassandra @Query

ho questa domanda di lavoro

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

e vorrei fare qualcosa di simile

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

ce l'ho a lavorare utilizzando

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

Ma per una serie di ragioni (stile codice, test, giuro che ci sono più) preferirei usare @Query. Qualche idea?

MODIFICA PER ULTERIORI INFORMAZIONI!

Passando in un array, set, o una lista restituisce Caused by: java.lang.IllegalArgumentException: encountered unsupported query parameter type [class [Ljava.lang.String;] in method public abstract

cercato anche:

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

Non abbiamo trovato nulla, le ricerche della biblioteca per una sola persona con un nome 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); 

Nulla trovato, la richiesta è sfuggita e finisce ('''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); 

Non abbiamo trovato nulla, la richiesta è sfuggito e finisce ('Joe'',''Jim')

+1

hai provato qualche tipo di raccolta? Imposta o Elenco di stringhe anziché array di stringhe? –

+0

Entrambi gli elenchi e gli insiemi restituiscono un errore simile all'avvio 'Causato da: java.lang.IllegalArgumentException: rilevato tipo di parametro di query non supportato [interfaccia java.util.Impostato] ' –

risposta

8

Devi usare bracciali quando si utilizza IN.

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

Ma ci sono altri problemi nel codice. Li ho cambiati tutti con un buon standard di programmazione come di seguito. Compreso il mio preferito di usare parametri con nome.

@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

Vorrei poter usare i parametri denominati, ma dato che sto effettivamente passando in 7, finisco con l'eccezione di' Invalid amount of bind variable'. Sono in grado di farlo funzionare quando si passa in una singola stringa per vincolare, ma quando si passa in una matrice lo vedo all'avvio 'Causato da: java.lang.IllegalArgumentException: rilevato tipo di parametro di query non supportato [class [Ljava .lang.String;] ' –

+1

Allora puoi provare il primo. la tua stessa query con i braccialetti. Come 'IN (? 1)' –

+0

Se passo in un unico nome, funziona. Se passo più, viene racchiuso tra virgolette, quindi la query finisce 'IN ('Joe, Jim')'. Ovviamente, nessuno si chiama 'Joe, Jim'. Ho anche provato a costruire una stringa di richiesta, "Joe", "Jim", ma quando viene passata nella libreria sfugge a tutte le virgolette e finisco con "" "Joe", "Jim" –

2

Sembra impossibile!

Ho controllato il codice sorgente di spring-data-cassandra-1.3.2.RELEASE.jar.

I tipi di dati consentiti di parametro nel metodo di query sono 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.

Essi possono essere trovati 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 })); 

Se passiamo i tipi di dati diversi da questi, poi org.springframework.data.cassandra.repository.query.CassandraQueryMethod.verify(Method method, RepositoryMetadata metadata) getteranno IllegalArgumentException.

Problemi correlati