it-swarm.com.ru

Как найти отдельные строки с полем в списке, используя JPA и Spring?

Я использую Spring для подключения к БД. У меня есть интерфейс, расширяющий CrudRepository<People, Long> Вот запрос, который я хочу выполнить на базе данных db: SELECT DISTINCT name FROM people WHERE name NOT IN UserInputSet. Я бы предпочел сделать это без каких-либо заметок sql, поэтому, если это возможно без NOT, это нормально.

Есть ли способ сделать это? Я посмотрел на весенний документ, но ничего не могу найти ( http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation )


Это то, что я устал, но это не работает.

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

это исключение, которое я получаю:

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

а также 

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

Я наконец смог найти простое решение без аннотации @Query.

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

Конечно, я получил объект people вместо только Strings. Затем я могу внести изменения в Java.

37
Paul Fournel

Вы пытались переписать ваш запрос, как это?

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

Обратите внимание, я предполагаю, что ваш класс сущности называется People, а не 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

Вы не можете использовать как это?

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

Постскриптум Я много пишу запросы в SQL Server 2012, и использование nolock на сервере - хорошая практика, вы можете игнорировать nolock, если используется локальная база данных.

Похоже, ваше имя базы данных не отображается правильно (после того, как вы обновили свой вопрос)

1
ha9u63ar