복붙노트

[SPRING] JPA와 Spring을 사용하여 목록에서 필드가있는 고유 한 행을 찾는 방법?

SPRING

JPA와 Spring을 사용하여 목록에서 필드가있는 고유 한 행을 찾는 방법?

나는 봄에 연결하는 db를 사용하고 있습니다. 나는 CrudRepository 을 확장하는 인터페이스를 가지고있다. 다음은 db에서 실행하고자하는 쿼리이다. UserInputSet에 이름이없는 사람들로부터 SELECT DISTINCT 이름. 나는 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)]

해결법

  1. ==============================

    1.마침내 @Query 주석이없는 간단한 솔루션을 찾을 수있었습니다.

    마침내 @Query 주석이없는 간단한 솔루션을 찾을 수있었습니다.

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

    물론 String 객체가 아닌 객체 객체가 있습니다. 그런 다음 java에서 변경을 수행 할 수 있습니다.

  2. ==============================

    2.이렇게 쿼리를 수정 해 보았습니까?

    이렇게 쿼리를 수정 해 보았습니까?

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

    참고, 귀하의 엔티티 클래스는 사람이 아니라 사람이라고 가정합니다.

  3. ==============================

    3.

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

    4.이런 식으로 사용할 수 없습니까?

    이런 식으로 사용할 수 없습니까?

    @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을 사용하는 것이 좋은 방법입니다. 로컬 db가 사용되면 nolock을 무시할 수 있습니다.

    데이터베이스 이름이 올바르게 매핑되지 않은 것 같습니다 (질문을 업데이트 한 후).

  5. from https://stackoverflow.com/questions/32079084/how-to-find-distinct-rows-with-field-in-list-using-jpa-and-spring by cc-by-sa and MIT license