Как найти отдельные строки с полем в списке с помощью JPA и Spring?

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

Есть ли способ сделать это? Я посмотрел на документ Spring, но ничего не могу найти (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)]

Ответ 1

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

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

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

Ответ 2

Вы пробовали переписать свой запрос следующим образом?

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

Заметьте, я предполагаю, что ваш сущностный класс имеет имя People, а не People.

Ответ 3

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

Ответ 4

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

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

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

Кажется, что ваше имя db неправильно отображается (после того, как вы обновили свой вопрос)

Ответ 5

@Query("SELECT distinct new com.model.referential.Asset(firefCode,firefDescription) FROM AssetClass ")
List<AssetClass> findDistinctAsset();