2017-12-27 49 views
0

설명JpaRepository 및 오브젝트의 중첩 목록으로 검색하는 방법은 무엇입니까?

PersonRepositoryPerson 기업, Person 클래스는 List<Qualification>이 포함되어 있습니다. Qualification 클래스에는 3 개의 간단한 필드가 있습니다.

나는 사용자 정의 방식에 @Query 주석을 추가하고 결과를 얻을 수 JPQL을 사용하려고했지만, 그 자체가 List<Qualification> 대신 Qualification의 단순한 필드 포함 저장소로 Qualification 클래스 필드는 JPQL에 조작을 위해 사용할 수 없었습니다.

이러한 자격의 중첩 필드는 어떻게 검색합니까?

쿼리 지금은 자격의 experienceInMonths보다 큰 3 이하 9 및 자격의 이름 필드 = '자바'를 어디 사람 개체의 목록을 찾을 필요가있다.

코드

Person.java

@Data 
@Entity 
public class Person { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private String id; 

@NotEmpty 
@Size(min = 2) 
private String name; 

@NotEmpty 
@Size(min = 2) 
private String surname; 

@ElementCollection(targetClass = java.util.ArrayList.class, fetch = FetchType.EAGER) 
private List<Qualification> qualifications = new ArrayList<>(); 

} 

PersonRepository.java

@Repository 
public interface PersonRepository extends JpaRepository<Person, String> { 
} 

Qualification.java

@Data 
@AllArgsConstructor 
public class Qualification implements Serializable { 

    @Id @GeneratedValue 
    private String id; 
    private String name; 
    private String experienceInMonths; 
} 

편집 :this post이 중복되지 않습니다. 여기에 중첩 된 개체 모음이 있습니다. 단일 참조 만이 아닙니다.

+0

의 사용 가능한 복제 [스프링 데이터 JPA 찾을 포함 된 개체 속성에 의해] (HTTPS를 : //stackoverflow.com/questions/24441411/spring-data-jpa-find-by-embedded-object-property) –

+0

게시물 편집에서 언급했듯이이 질문은 제안 된 답변과 일치하지 않습니다. 붙여 넣은 코드에서 볼 수 있듯이 객체 중 하나만 아니라 객체의'List'에 문제가 있습니다. – DevDio

답변

1

먼저 String에서 int으로 변경하십시오 (그렇지 않으면 문자열과 숫자를 비교할 수 없습니다). 그런 다음이 '소시지'를 사용하려고 할 수 있습니다

List<Person> findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndName(int experienceGreater, int experienceLess, String name); 

을 또는이 꽤 좋은 방법을 사용하려고 할 수 있습니다

@Query("select p from Person p left join p.qualifications q where q.experienceInMonths > ?1 and q.experienceInMonths < ?2 and q.name = ?3") 
List<Person> findByQualification(int experienceGreater, int experienceLess, String name); 
+0

로컬로 작업 했습니까? JPQL 버전은'org.hibernate.QueryException : 스칼라 콜렉션 엘리먼트를 역 참조 할 수 없다 : '와 소시지를 생성한다.''원인 : java.lang.IllegalStateException : 기본 타입의 경로 소스 [null]을 역 참조하려고 시도했다. Qualification # experienceInMonths 타입을 int로 변경해도 – DevDio

+0

@DevDio'Qualification'에'@ Entity'를 추가하고'@ ElementCollection'을'@ OneToMany'로 대체하십시오 (유사한 변형이 저에게 효과적입니다 ...) – Cepr0

+0

Ok, 마침내 작동 시켰지만 Hibernate에서 별도의 'Qualification' 테이블을 구현해야했습니다. FK to Person (@Entity, @ManyToOne이있는 추가 필드 담당자) + 'QualificationRepository'가 필수 항목입니다. 또한 제안 된 방법을 테스트 한 결과 JPQL 버전이 정상적으로 작동했지만 '소시지'이름은 'findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndQualifications_Name'으로 조정해야했습니다. 그렇지 않으면 사람 이름을 검색했습니다. 도움에 대한 큰 감사 @ Cepr0! – DevDio