条件付き結合を行う条件クエリを作成するためのコードを作成しています。しかし、それは正しく終了しません。以下の例を検討してください: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を有します
私の要件は簡単です。私はテスラ車のオーナーをすべて取得したいと思っています。 次のコードは、そのためには良い作品:
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);
Owner
が2台、1はTESLAであり、他はVOLVOですが所有している場合、今私の要件は、あります。 Owner
エンティティにはTESLA
のみを含める必要があります。
どうすればよいですか?
あなたは 'Owner'オブジェクトを選択しています。もし' Owner'オブジェクトがそれらの2台の車を持っていれば、オブジェクトがロードされると、それらの2台の車があります。 'Owner'オブジェクトの半分は返されません。 Ever – DN1
しかし、通常のSQL JOINクエリ 'SELECT * FROM ownerをo JOINのように実行したとき、c.ownerid = o.idのc.manufacturer = 'TESLA';では1つのタプルのみを返します。 JPAがSQLやJDBC上でどのような利点を持っているのですか? –
'Owner 'JOHNに2台の車がある場合、JOHNには2台の車があるので、オブジェクトは' Owner' JOHNとして返されます。それがO-Oの仕組みです。フラットなSQLクエリを実行し、それらの情報の一部のみをオブジェクトに操作したい場合、JPAはO-O用に設計されています。オブジェクトはIDとリレーションを持ちます。 – DN1