JPAではテーブルをクラスで定義します。もちろん例外とかはいろいろあるのですが、1テーブル1クラスというつくりで、これをエンティティと呼びます。
もともとクラスを作ってからDBを作成したり、JTAの規約どおりにテーブルが設計されていればリレーションなどもSQLを書くことなく楽にかけます。
ところが、規約を無視していたりするとなかなかこれが難儀です。
JPAでのリレーションの取得方法
JPAでリレーションを定義する方法は大きく分けて、
- リレーションされたテーブルのプロパティを格納しておくエンティティクラスを再作成する方法
- アノテーションでリレーションを管理する方法
の2通りがあります。
WEBでいろいろ検索しましたが、2の情報のほうがよくでてきますね。
ただアノテーションで管理する場合、WHERE句が複雑なときの対処法などがいまいちよくわかりません。SQLを書かなくてよいメリットはあるのですが。
ここでは1の方法であるリレーションされたテーブルのエンティティを再作成する方法を説明したいと思います。
ここでProductとSupplierをリレーションでつなげたいとき、
1 Product,Supplier両方のプロパティを保持するクラスをつくる。例えばSettedProductとします。
2 SettedProductに保持させたいプロパティと定義する、リレーション情報などは一切書かない。
この例で言うとproductID,supplierId,supplierName,productNameをprivateで普通に定義し、ゲッター、セッターと後述するインスタンスを記述しておきます。
3 エンティティマネージャーにて下記のようなJPQLのSQL文を書きます。
1 2 3 |
List<SettedProduct> products ; products=em.createQuery("SELECT new com.sample.SettedProuct(p.productID,p.supplierId,s.supplierName,p.productName) FROM Product p LEFT JOIN Supplier s ON p.supplierID=s.Id ",SettedProduct.class).getResutList(); |
これでproductsをみてリレーションが取れていればOKです。
SQL文の中でnew パッケージ名 をコンストラクタ式といいます。SettedProductのなかにはこのコンストラクタを当然用意しておかなくてはいけません。
ようはJOINしたプロパティを収容できるクラスを定義し、そこに対してセットします。
プロパティが多いと大変そうですが、とりあえずこれでリレーションがとえます。