web-dev-qa-db-fra.com

Comment trouver des lignes distinctes avec un champ dans une liste à l'aide de JPA et Spring?

J'utilise Spring pour me connecter à la base de données. J'ai une interface qui étend CrudRepository<People, Long> Voici la requête que je veux exécuter sur la base de données: SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet. Je préférerais le faire sans annotation SQL, donc si c'est possible sans la variable NOT c'est très bien.

Y a-t-il un moyen de le faire? J'ai jeté un coup d'œil au document de printemps, mais je ne trouve rien ( http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation )


C'est ce que j'ai fatigué mais ça ne marche pas.

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

c'est l'exception que je reçois:

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

et 

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

J'ai finalement pu trouver une solution simple sans l'annotation @Query.

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

Bien sûr, j'ai les objets people au lieu de Strings. Je peux alors faire le changement en Java.

37
Paul Fournel

Avez-vous essayé de reformuler votre requête comme ceci?

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

Remarque: je suppose que votre classe d'entité s'appelle People et non pas 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

Pouvez-vous pas utiliser comme ça?

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

P.S. J'écris beaucoup de requêtes dans SQL Server 2012 et il est recommandé d'utiliser nolock sur le serveur. Vous pouvez ignorer nolock si une base de données locale est utilisée.

On dirait que votre nom de base de données n'est pas mappé correctement (après avoir mis à jour votre question)

1
ha9u63ar