it-swarm.com.de

Wie finde ich mit JPA und Spring eindeutige Zeilen mit Feld in der Liste?

Ich verwende Spring, um mich mit der Datenbank zu verbinden. Ich habe eine Schnittstelle, die CrudRepository<People, Long> erweitert. Hier ist die Abfrage, die auf der Datenbank ausgeführt werden soll: SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet. Ich würde es vorziehen, es ohne SQL-Annotation zu tun. Wenn dies ohne NOT möglich ist, ist das in Ordnung.

Gibt es eine Möglichkeit, dies zu tun? Ich habe mir das Frühlingsdokument angesehen, kann aber nichts finden ( http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation )


Das ist es, was ich müde bin, aber es funktioniert nicht.

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

dies ist die Ausnahme, die ich bekomme:

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

und 

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

Endlich konnte ich eine einfache Lösung ohne die @Query-Annotation finden.

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

Natürlich bekam ich die Leute zum Objekt anstatt nur Strings. Ich kann die Änderung dann in Java durchführen.

37
Paul Fournel

Haben Sie versucht, Ihre Anfrage so umzuformulieren?

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

Ich nehme an, Ihre Entitätsklasse heißt People und nicht people.

12
pioto
@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (:names)")
List<String> findNonReferencedNames(@Param("names") List<String> names);
2
aviv zvi

Kannst du nicht so verwenden?

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

P.S. Ich schreibe häufig Abfragen in SQL Server 2012, und die Verwendung von nolock im Server ist eine gute Praxis. Sie können nolock ignorieren, wenn eine lokale Datenbank verwendet wird.

Anscheinend wird Ihr Datenbankname nicht richtig zugeordnet (nachdem Sie Ihre Frage aktualisiert haben)

1
ha9u63ar