2014-02-25 4 views
1

외부 개체에서 ID 만 가져올 수 없습니다.JPA TupleQuery에서만 ID 가져 오기

간단한 예 :

class Person { 
    int id; 
    String name; 
    @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID") 
    @ManyToOne(fetch = FetchType.LAZY) 
    Address addressesId 
} 

class Address { 
    int id; 
    String city; 
} 

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery(); 
Root<Person> from = q.from(Person.class); 
q.multiselect(from.get(Person_.name), 
              from.get(Person_.AdresseId); 
TypedQuery<Tuple> query = em.createQuery(q); 
List<Tuple> resultList = query.getResultList(); 

나는 사람이 테이블에 존재 물론이다 주소에서만 ID를 필요로하지만, JPA는 자동으로 내부를 생성 널 주소와 쿼리 및 단체가 생략 가입 할 수 있습니다. 조인은 필요하지 않습니다. 이 TupleQuery의 Address에서 ID 만 가져 오는 방법이 있습니까?

는 Xanas

답변

4

JPA는 데이터를 반환하기 위해 제공 매핑을 사용할 수 있으며, 사람이 내 주소 외래 키가 객체 참조 매핑을 사용하여 매핑되기 때문에, 질의에의 포함은이 JPA에 참여해야합니다. Koitoer가 아래에서 설명 할 때 왼쪽 외부 조인을 사용하는 것이 null을 포함하는 유일한 방법입니다.

그러나 대안은 Person 엔터티 내의 addressId 외래 키에 대한 다른 읽기 전용 기본 매핑을 만드는 것입니다.

class Person { 
    int id; 
    String name; 
    @JoinColumn(name = "ADDRESS_ID", referencedColumnName = "ID") 
    @ManyToOne(fetch = FetchType.LAZY) 
    Address address; 
    @Column(name ="ADDRESS_ID", insertable=false, updatable=false) 
    private Long addressId; 
} 

경우에만 foriegn 키 값이 아니라 전체 주소 엔티티를 필요로 할 때이 말은 '주소'당신이 주소 개체 인스턴스를 할 때 속성을 사용할 수, 쿼리의 'addressId'것 :

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
CriteriaQuery<Tuple> q = criteriaBuilder.createTupleQuery(); 
Root<Person> from = q.from(Person.class); 
q.multiselect(from.get(Person_.name), 
       from.get(Person_.AddressId); 
TypedQuery<Tuple> query = em.createQuery(q); 
List<Tuple> resultList = query.getResultList(); 

은 조인없이 Person 테이블에서 name 및 addressId 값을 반환합니다.

+0

감사합니다. 훌륭한 답변입니다. – Xanas