조건부 조인을 수행하기위한 조건을 작성하기 위해 코드 작업을 해왔습니다. 그러나 그것의 올바른 종료하지 않습니다. 다음 예제를 고려하십시오.JPA CriteriaQuery는 조건과 일치하는 엔티티 만 합치다
2 개의 엔티티 Owner
및 Car
이 있습니다. Owner
은 Car
과 OneToMany
의 관계를 갖는다. .
@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
엔터티
는 List
Car
의 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
을 포함해야합니다.
어떻게하면됩니까?
당신은'Owner' 객체를 선택하고,'Owner' 객체가 그 두 개의 자동차를 가지고 있다면, 객체가로드 될 때, 그 두 개의 자동차를 갖게됩니다. 'Owner' 객체의 절반은 반환되지 않습니다. Ever – DN1
그러나 일반 SQL JOIN 쿼리'SELECT * FROM owner를 o JOIN 자동차로 c as c.ownerid = o.id where c.manufacturer = 'TESLA'로 실행하면 '하나의 튜플 만 반환합니다. JPA가 SQL이나 JDBC에 대해 갖는 장점은 무엇입니까? –
'Owner' JOHN이 2 대의 자동차를 가지고 있다면 JOHN은 2 대의 자동차를 가지고 있기 때문에 'Owner'JOHN으로 반환되는 객체는 항상 2 대가됩니다! 그것이 O-O가 작동하는 방식입니다. 플랫 SQL 쿼리를 수행하고 해당 정보의 일부만 가진 객체로 조작하려는 경우 JPA는 ID와 관계가있는 객체로 O-O 용으로 설계되었습니다. – DN1