2017-09-24 10 views
0

명명 된 쿼리를 사용하여 특정 값이 들어있는 목록을 기반으로 모든 엔티티를 찾을 수 있습니다.특정 값을 포함하는 목록 (인스턴스 변수)을 기반으로 모든 엔티티를 찾는 명명 된 쿼리

public class Phone implements Serializable { 

    private static final long serialVersionUID = -34672347534985L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @NotNull 
    @Column(name = "number") 
    private String number; 
    @Column(name = "type") 
    @Enumerated(EnumType.STRING) 
    private EPhoneType phoneType; 
    @Column(name = "creationDate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate; 
    @ManyToOne 
    private User user; 


    /* Getters and Setters */ 

} 

지금 내가 전화를 가지고 모든 사용자를 찾을 필요가 :

나는 깨끗한이 게시물을 유지하기 위해 전화 엔티티를 단순화하기 위하여려고하고있다

public class User implements Serializable { 

    private static final long serialVersionUID = -82485348776234092345L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @NotNull 
    @Size(min = 5, max = 50) 
    @Column(name = "email") 
    private String email; 
    @NotNull 
    @Size(min = 5, max = 50) 
    @Column(name = "password") 
    private String password; 
    @Column(name = "creationDate") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date creationDate; 
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user", cascade = CascadeType.ALL) 
    private List<Phone> phoneNumbers; 


    /* Getters and Setters */ 
} 

사용자라는 실체가 전화 번호 : 289647 .... and Phone.type = '모바일'

전화 유형은 enum입니다.

명명 된 쿼리를 사용하여이를 달성하는 방법을 잘 모르겠습니다. 정규 네이티브 쿼리를 사용하면 테이블에서 JOIN을 사용하여이 작업을 수행 할 수 있습니다. 누구나 NamedQuery를 사용하여 이와 같은 작업을 수행 했습니까?

답변

1

먼저 "명명 된 쿼리"와 "JPQL"쿼리를 혼동하는 경우가 있습니다.

JPA 쿼리는 "native"와 "JPQL"중 하나 일 수 있습니다. 차이점은 쿼리 언어 (SQL 또는 OQL 형, 첫 번째는 레코드 지향형, 두 번째는 객체 지향형)입니다.

두 가지 유형의 쿼리는 동적 (런타임에서 작성) 또는 정적 (엔티티와 마찬가지로 지속성 컨텍스트의 정적 부분으로 정의 된 "명명 된"이름 지정) 일 수 있습니다. 후자는 준비된 쿼리를 만들어 저장하여 최적화 할 수 있습니다.

OQL과 비슷한 언어 (HQL, JPQL)로 결합하는 것은 SQL과 비슷한 방식으로 이루어 지지만 조인 관계 (테이블)가 아니라 "객체 속성"을 나타냅니다. 애트리뷰트에 합류 할 때, 이미 엔티티 정의의 일부이기 때문에 어떤 기준도 정의하지 않습니다. 한편, 결합은 엔티티 간의 연관 당 행을 생성하므로 User이 목록에 나타나는 Phone과 같이 여러 번 반복되는 것을 피하려면 distinct 절을 사용하는 것이 좋습니다.

은 아마 당신이 원하는 것은 : 유형과 n.number = : 수

쿼리 위 모두 사용할 수 있습니다

는 u는 사용자로부터 유 N n.type =이 u.phoneNumbers 가입 왼쪽 선택 명명 된 변수 또는 명명되지 않은 변수로 실행하려면 이름이 지정된 매개 변수 typenumber (열거 형 및 문자열)을 제공해야합니다.

+0

많은 것들을 지워줍니다. 고마워. 필자는 명명 된 쿼리에서 조인을 사용하지 않고 단순히 개체 특성을 넣어서 원하는 결과를 얻는 방법이 있다는 인상하에있었습니다. 고마워. 도움을 감사하십시오. –