2015-08-18 10 views
10

Sto usando Spring per connettermi al db. Ho un'interfaccia che si estende CrudRepository<People, Long> Ecco la query che voglio eseguire sul db: SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet. Preferirei farlo senza alcuna annotazione sql, quindi se è possibile senza il NOT va bene.Come trovare righe distinte con campo nell'elenco usando JPA e Spring?

C'è un modo per farlo? Ho guardato il doc di primavera, ma non riesco a trovare nulla (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation)


Questo è quello che stanco, ma non sta funzionando.

@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (?1)") 
List<String> findNonReferencedNames(List<String> names); 

questa è l'eccezione ottengo:

Error creating bean with name 'peopleRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List de.test.tasks.persistence.PeopleRepository.findNonReferencedNames(java.util.List)! 

e

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: people is not mapped [SELECT name FROM people WHERE name NOT IN (?1)] 
+0

"non funziona". Non posso essere più chiaro di così ... a parte ciò che sta accadendo, quale errore, quale registro, quale entità, ecc. –

+0

aggiornerò la domanda con l'errore che ho. –

+0

non dovresti "colon" ise il bit '1'? – ha9u63ar

risposta

23

finalmente sono in grado di capire una soluzione semplice, senza la @Query annotazione.

List<People> findDistinctByNameNotIn(List<String> names); 

Certo, ho avuto la gente oggetto, invece di solo stringhe. Posso quindi fare il cambiamento in java.

+0

maggiori informazioni: http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ –

+0

Ho un requisito simile. Ho usato 'Lista findDistinctByUserName()' e lancia 'NoSuchElementException' all'avvio. Tuttavia, se fornisce un parametro, funziona correttamente ma non fornisce il risultato che intendo. Il parametro è obbligatorio? Come ottengo i valori dell'intera tabella per una colonna distinta? – Maz

0

si fa a non utilizzare in questo modo?

@Query("SELECT DISTINCT name FROM people p (nolock) WHERE p.name NOT IN (:myparam)") 
List<String> findNonReferencedNames(@Param("myparam")List<String> names); 

P.S. Scrivo molte query in SQL Server 2012 e l'utilizzo di nolock nel server è una buona pratica, è possibile ignorare nolock se si utilizza un db locale.

Sembra che il tuo nome db non viene mappata correttamente (dopo aver aggiornato la tua domanda)

+0

non sono più o meno corretti di posizionali (anche se personalmente userò anche named). –

6

Hai provato riformulare la query come questo?

@Query("SELECT DISTINCT p.name FROM People p WHERE p.name NOT IN ?1") 
List<String> findNonReferencedNames(List<String> names); 

nota, sto assumendo la classe entità viene chiamato People, e non people.