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
'programing' 카테고리의 다른 글
jQuery 양식 serialize - 빈 문자열 (0) | 2023.08.31 |
---|---|
PowerShell: 날짜 비교 (0) | 2023.08.31 |
Swift - 하위 클래스에 의해 재정의되어야 하는 클래스 메서드 (0) | 2023.08.31 |
Internet Explorer 11 "스토리지 부족" 오류 (0) | 2023.08.26 |
mysql 쿼리에서만 첫 번째 행 가져오기 (0) | 2023.08.26 |