2016-03-24 8 views
2

データベースクエリを処理する永続エンジンとしてJPAを使用します。Mysql/Hibernateで子エンティティを取得する

Parent - table 
+-----+---------+ 
|id | name | 
+-----+---------+ 
| 1 | name1 | 
| 2 | name2 | 
| 3 | name3 | 
+---------------+ 

child1 - table 
+--+---------+------+ 
|id|parent_id|name | 
+--+---------+------+ 
| 1| 1  | qwe | 
| 2| 1  | asd | 
| 3| 1  | dsf | 
| 4| 2  | xzc | 
+--+---------+------+ 

child2 - table 
+--+---------+------+------+ 
|id|parent_id|type |name | 
+--+---------+------+------+ 
| 1| 1  | 1 | qqq | 
| 2| 1  | 1 | www | 
| 3| 1  | 1 | eee | 
| 4| 1  | 2 | aaa | 
| 5| 1  | 2 | sss | 
| 6| 1  | 2 | ddd | 
| 7| 1  | 3 | zzz | 
| 8| 2  | 1 | xxx | 
+--+---------+------+------+ 

をそして、私のクラスは

@Entity 
@Table(name = "parent") 
public class Parent{ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent") 
    private List<Child1> children1; 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "parent") 
    private List<Child2> children2; 

} 

@Entity 
@Table(name = "child1") 
public class Child1{ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "parent_id", nullable = false) 
    private Parent parent; 

} 

@Entity 
@Table(name = "child2") 
public class Child2{ 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "type") 
    private int type; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "parent_id", nullable = false) 
    private Parent parent; 

} 

は私が Javaオブジェクトに親と子エンティティ(埋め込まれた、独自の一覧オブジェクトを取得したいと思います次のようにテーブル(MySQLは)あり)を次のように変更します。私はちょうど子の1つの実体を各親のために最大のidにしたいと思っています。

(この例では、parent(id:1)のchild1(id:3)とparent(id:2)のchild1(id:4))です。

また、私はchild2のそれぞれのタイプため最大 IDでchild2の取得したいです。 (最大:タイプ:2)、child2(ID:7)(最大タイプ:3)のように、

最後に、親(id:1)には1つのChild1(id:3)が1つあります(親(id:1)と子2(id:8) )をリストchildren1に持ち、リストchildren2に3つのChild2(id:3、id:6、id:7)を持ちます。

私の貧しい人々のために申し訳ありません。

ありがとうございました。

+1

親の最大IDを持つChild1オブジェクトにJPQLクエリを実行する場合は、あなたは何を試しましたか? –

答えて

0

私はあなたが子供のコレクションにフィルタをかけたいと思う。 Hibernate Filters

+0

なぜあなたはそれをしますか?なぜJPAベンダーの独立性を捨て去るようアドバイスするのですか? –

+0

フィルタリングされた子リストを持つ親entitiyをフェッチするための質問ではありませんか?たとえあなたが親に対してJPQLクエリを書くとしても、それはすべての子行を持つ親をフェッチしませんか? – Rima

+1

はい、絶対に私はフィルタリングされた子リストを持つ親を取得しようとします。しかし、私はクエリを書くことはできません。それは私が必要なものです。 –

1

あなたはこれまでに試したことを投稿する必要がありますが、私は「Everywhere™」をまだコメントできませんので、最初のものをお手伝いします。

私はあなたのクエリを実行するためにHQLを要求していると仮定しています。これを試してみてください:

2番目のクエリは非常によく似ています。もしそれがうまくいくとすれば、それは簡単なはずです。

+0

ありがとうございました。私が得たいのは、親エンティティとフィルタリングされた子を含むことです。私はこれらの2つのクエリを組み合わせることはできません。 –

+0

したがって、すべての子を持つ親エンティティを返す代わりに、それはあなたの要件を満たす子のみを返すようにしますか?私は、(あなたがJPAの別の実装への可能性の変更を必要としない限り)上記のフィルターのようなものを使用していると思います。 – rcyza

+0

いいえ、私は両親が必要です。なぜなら私は多くの親を取得し、それらのフィルタリングされた子を持つクライアントサイドアプリケーションにリストしたいからです。 –

関連する問題