programing

JPA와 Spring을 사용하여 목록에 필드가 있는 구별되는 행을 찾는 방법은 무엇입니까?

minimums 2023. 8. 31. 23:44
반응형

JPA와 Spring을 사용하여 목록에 필드가 있는 구별되는 행을 찾는 방법은 무엇입니까?

나는 스프링을 사용하여 DB에 연결하고 있습니다.인터페이스가 확장되어 있습니다.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/ #comparities.substitutes.substitutes.substitutes-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)]

저는 마침내 다음과 같은 간단한 해결책을 찾을 수 있었습니다.@Query주석

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

물론 Strings만 받는 대신 People object를 받았습니다.그런 다음 Java에서 변경할 수 있습니다.

당신은 당신의 질문을 이렇게 바꿔본 적이 있습니까?

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

참고, 엔티티 클래스의 이름이People그리고 아닌people.

@Query("SELECT DISTINCT name FROM people WHERE name NOT IN (:names)")
List<String> findNonReferencedNames(@Param("names") List<String> names);
@Query("SELECT distinct new com.model.referential.Asset(firefCode,firefDescription) FROM AssetClass ")
List<AssetClass> findDistinctAsset();

기본 쿼리를 사용하지 않고도 작동해야 한다고 생각합니다.

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

interface Name{
    String getName();
}

문자열을 가져오려면 다음을 사용합니다.

peopleRepository.findDistinctByNameNotIn().stream().filter(Objects::nonNu
ll).map(PeopleRepository.Name::getName).collect(Collectors.toList())

이렇게 쓰면 안 돼요?

@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로컬 DB가 사용되는 경우.

질문을 업데이트한 후 DB 이름이 올바르게 매핑되지 않는 것 같습니다.

아래와 같이 각 열에 대한 변수를 만들어 데이터를 가져올 다른 빈을 만들 수 있습니다.

@Getter
@Setter
@Builder
@ToString
public static class NameOnlyBean {
    //you have to follow camelCase here when creating variables.
    private String name;
}

JPA 쿼리를 사용하여 이렇게 생성된 빈을 사용하여 데이터 목록을 가져옵니다.

List<NameOnlyBean> yourJPAQuery(List<String> names);

언급URL : https://stackoverflow.com/questions/32079084/how-to-find-distinct-rows-with-field-in-list-using-jpa-and-spring

반응형