2017-11-01 2 views
0

조건부 조인을 수행하기위한 조건을 작성하기 위해 코드 작업을 해왔습니다. 그러나 그것의 올바른 종료하지 않습니다. 다음 예제를 고려하십시오.JPA CriteriaQuery는 조건과 일치하는 엔티티 만 합치다

2 개의 엔티티 OwnerCar이 있습니다. OwnerCarOneToMany의 관계를 갖는다. .

@Entity 
public class Owner { 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    private int id; 
    private String name; 
    private String email; 

    @OneToMany(mappedBy="owner",fetch=FetchType.LAZY) 
    private List<Car> cars; 

    ... 
} 

Car.java

@Entity 
public class Car{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private int id; 
    private String manufacturer; 
    private String regnumber; 

    @ManyToOne 
    @JoinColumn(name="ownerid") 
    private Owner owner; 
    ... 
} 
: 코드 Owner 엔터티

enter image description here

ListCar의 S (FetchType.LAZY@OneToMany 함께 사용)

Owner.java을 갖는다

내 요구 사항은 간단합니다. 나는 TESLA 차량의 모든 소유자를 얻고 싶습니다. 다음 코드는 좋은 작품하십시오 Owner 2 차를 소유하는 경우

CriteriaQuery<Owner> cq = cb.createQuery(Owner.class); 
Root<Owner> rootowner = cq.from(Owner.class); 
rootowner.fetch("cars"); 

cq.distinct(true); 

Join<Owner, Car> carjoin= rootowner.join(Owner_.cars); 
Expression<String> carmanExp = carjoin.get(Car_.manufacturer); 
Predicate p = cb.like(carmanExp, "TESLA"); 
cq.where(p); 

TypedQuery<Owner> tq = em.createQuery(cq); 

이제 내 요구 사항은, 하나는 TESLA이다 다른 하나는 VOLVO입니다. Owner 엔티티에만 TESLA을 포함해야합니다.

어떻게하면됩니까?

+0

당신은'Owner' 객체를 선택하고,'Owner' 객체가 그 두 개의 자동차를 가지고 있다면, 객체가로드 될 때, 그 두 개의 자동차를 갖게됩니다. 'Owner' 객체의 절반은 반환되지 않습니다. Ever – DN1

+0

그러나 일반 SQL JOIN 쿼리'SELECT * FROM owner를 o JOIN 자동차로 c as c.ownerid = o.id where c.manufacturer = 'TESLA'로 실행하면 '하나의 튜플 만 반환합니다. JPA가 SQL이나 JDBC에 대해 갖는 장점은 무엇입니까? –

+1

'Owner' JOHN이 2 대의 자동차를 가지고 있다면 JOHN은 2 대의 자동차를 가지고 있기 때문에 'Owner'JOHN으로 반환되는 객체는 항상 2 대가됩니다! 그것이 O-O가 작동하는 방식입니다. 플랫 SQL 쿼리를 수행하고 해당 정보의 일부만 가진 객체로 조작하려는 경우 JPA는 ID와 관계가있는 객체로 O-O 용으로 설계되었습니다. – DN1

답변

1

간단한 JPA 쿼리에서 요청한 것을 JPA Entity의 조작으로 처리 할 수 ​​없으므로 더 이상 JPA 쿼리를 데이터베이스에 표시하지 않습니다. 다시 말하면, JPA가 테슬라 만 참조하는 소유자를 돌려 줄 때, 데이터베이스와 동기화 할 때 현재 제거 된 볼보로 무엇을하고 싶습니까?

귀하의 경우, 가장 쉬운 해결책은 소유주에 대한 참조가 있기 때문에 원하는 자동차를 대신 쿼리하는 것입니다. 소유자가 두 개 이상의 테슬라를 가질 수있는 곳에서 중복을 얻을 수 있습니다. 결과를 직접 자동차 소유자에게 보여주는지도를 만들어이 문제를 해결할 수 있습니다.