2017-11-29 3 views
0

私は関係が4つのテーブルを持っています。あいうえお。Jpa関係で選択

だから私は選択怒鳴るを書いた:

select NEW org.example.ExtendsA(a,b.name,c.name,d.name) 
from A a LEFT JOIN a.bItems b LEFT JOIN a.cItems c LEFT JOIN b.dItems d 
order by b.name ASC; 

Aはユニークですが、関係はincompletteです。

select NEW org.example.ExtendsA(a,b.name,c.name,d.name) 
from A a LEFT JOIN FETCH a.bItems b LEFT JOIN FETCH a.cItems c 
LEFT JOIN FETCH b.dItems d order by b.name ASC; 

Aがユニークではありません。

と私はこれを試してみました。

オブジェクト定義は次のとおりです。

@Entity 
public class A implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private Long id; 

    @NotNull 
    @Size(min = 1, max = 100) 
    @Column(name = "NAME") 
    private String name; 

    @OneToMany(mappedBy = "aId") 
    private List<B> bItems; 

    @OneToMany(mappedBy = "aId") 
    private List<C> cItems; 

} 

いくつかの関係が空になっているが、nullに関係を持つオブジェクトが必要です。 いくつかのオブジェクトはBとCの間に複数の関係があり、1つのAオブジェクト(別名A)ですべてを選択したいと考えています。

この問題の解決方法を教えてください。たぶんアプローチは悪いですか?

私はEclipeLinkデータプロバイダを使用しています。

+2

あなたは一意ではどういう意味ですか?それはテーブルです –

+0

私の目標は:オブジェクトAはselectに一度だけ現れ、関係を含んでいます。この環境内のユニークな言葉は良い選択ではないかもしれません。 – Zaosz

+0

例:distinct(A) – Zaosz

答えて

0

これはOneToMany relathionshipsを読み込む際の典型的な問題です。

これは、SQL結果セットの性質によるものです。エンティティが他のエンティティにリンクされている状態でエンティティを結合したSQL結果を想像してみてください。左側では、このエンティティのフィールドは、関連するエンティティの数だけ複製されます。

幸いにも、EclipseLinkはそれらをフィルタリングせず、結果に同じエンティティの多くのアイテムを取得します。ただし、EclipseLinkは十分にスマートであり、各アイテムは実際には同じJavaオブジェクトインスタンスになります。

このようなクエリではsetMaxResultsを使用できない理由もあります。

distinctキーワードを使用する必要があります。この特定のキーでは実際のSQLにマップされず、重複したエンティティをフィルタリングします。または、それらを手動でフィルタリングすることもできます。