2016-12-27 9 views
0

私は、4つのテーブルCustomerEntity、CustomerMaster、要求とUserMaster
を持っており、テーブルの構造以下の持っているHibernateで複数のテーブルに参加するには?

私はそれが提供するこの

sb.append("select c from CustomerEntity c, Request r ") 

のように休止状態からの問い合わせを作ってるんだ

CustomerEntity (id,address,branch,branch_id,city,entity_status,request_id,user_master_id) 
CustomerMaster (id,customer_name,customer_type) 
UserMaster(id,customer_master_id,employee_id,unique_id,employee_id) 
Request(id,customer_master_id,parent_request_id,request_status,user_master_id) 

私は必要なデータを修正しましたが、今ではUserMaster idとCustomerMaster idの値を取得する必要があります。既存のクエリでUserMasterテーブルとCustomerMasterテーブルを結合することによってのみ取得できますが、わからない上記のクエリのようにすべての投影データを取得します。 'c'のデータを取得していますが、新しいクエリでは、これら4つのテーブルをすべて結合した後にクエリのすべての値を実行します。

私は次のクエリ使用しています。このようにHibernateで

sb.append("select * from (CustomerEntity as c join Request as r 
    on r.id = c.request_id) 
    left join CustomerMaster as c1 on r.customer_master_id = c1.id 
    left join UserMaster as u 
    on r.customer_master_id = u.customer_master_id"); 

をが、それは働いていないようです。

答えて

1

休止状態(JPA)で任意の数の表を結合することは可能です。どのようにデータを返すべきかは、ビジネス要件のニーズによって決まります。

あなたの例では、StringBuilder/StringBufferを利用したネイティブSQLクエリを作成しているようですね。それは必要ありません。ほとんどの場合役立たない。

通常、マッピングされたエンティティ、つまりデータベーステーブルのデータを表すJavaオブジェクトを返すために、hibernateが適用されます。次に、現在のパーシスタンスコンテキスト内、またはデタッチ状態のアクセッサとミューテータ(ゲッタとセッタ)を使用して、このオブジェクトを操作できます。

ハイバネートマッピングを使用すると、Javaメソッド呼び出しを介してグラフをナビゲートすることによって、割り当てられたすべてのオブジェクトにアクセスできるリレーションを定義できます。

多分、hereをご覧ください。

しかし、これはORM層の能力を使ってデータにアクセスすることを前提としています。つまり、Session/EntityManagerオブジェクトで呼び出されるエンティティクエリ(アクセスメソッド)、HQL/JPQLクエリ、またはCriteria APIです。

Thisおよびthisは、さらに詳しい情報を提供します。

たとえば、次のようなHQLクエリを書くだけで十分であると思われるマッピングがあるとします。 SELECT c FROM CustomerEntity AS cこれは単一のエンティティを返す。アクセサーを介して、グラフをナビゲートすることができます。

HQLで結合を記述することもできます。この場合、結合するエンティティをSELECT c FROM CustomerEntity AS c JOIN c.request AS r ...のように指定するだけでよく、通常の場合はON節を省略できます。 Hibernateは、マッピングのためにエンティティがどのように接続されているかを知っています。

適切な量のデータを取得する(熱心であるのか怠惰なのか)&(単方向対双方向)については、マッピングをよく考慮する必要があります。場合によっては、パフォーマンス上の不利益を避けるためにJavaメソッドでナビゲートするよりも、ユースケースに合わせたクエリを作成する方が良いでしょうが、データ構造とデータサイズに応じて決定する必要があります。

最後に、必要な場合はnative SQL queriesを使用することもできますが、それをJavaオブジェクトにマッピングする際には注意が必要です。

関連する問題