2017-11-01 4 views
0

条件付き結合を行う条件クエリを作成するためのコードを作成しています。しかし、それは正しく終了しません。以下の例を検討してください:JPA CriteriaQueryは、条件に一致するエンティティのみを結合します。

私は2つのエンティティOwnerCarを持っています。 Ownerは、CarOneToManyの関係にあります。 。

@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を有します

私の要件は簡単です。私はテスラ車のオーナーをすべて取得したいと思っています。 次のコードは、そのためには良い作品:

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のみを含める必要があります。

どうすればよいですか?

+0

あなたは 'Owner'オブジェクトを選択しています。もし' Owner'オブジェクトがそれらの2台の車を持っていれば、オブジェクトがロードされると、それらの2台の車があります。 'Owner'オブジェクトの半分は返されません。 Ever – DN1

+0

しかし、通常のSQL JOINクエリ 'SELECT * FROM ownerをo JOINのように実行したとき、c.ownerid = o.idのc.manufacturer = 'TESLA';では1つのタプルのみを返します。 JPAがSQLやJDBC上でどのような利点を持っているのですか? –

+1

'Owner 'JOHNに2台の車がある場合、JOHNには2台の車があるので、オブジェクトは' Owner' JOHNとして返されます。それがO-Oの仕組みです。フラットなSQLクエリを実行し、それらの情報の一部のみをオブジェクトに操作したい場合、JPAはO-O用に設計されています。オブジェクトはIDとリレーションを持ちます。 – DN1

答えて

1

シンプルなJPAクエリーでは、JPAエンティティを操作してデータベース内の内容を表現しないようにすることはできません。言い換えれば、JPAがあなたにTeslaだけを参照しているOwnerを返すとき、それがデータベースと同期するときに今削除されたVolvoで何をしたいのですか?

あなたの場合、最も簡単な解決策は、所有者への参照があるため、代わりにあなたが望む車を検索することです。所有者に2つ以上のテスラがある場合は、重複を取得します。結果を自分の車にオーナーの地図を作成することで、この問題を解決できます。

関連する問題