Top / Hibernate / マッピング定義について / 結果にクエリを適用する

通常、ユーザクラスを検索して、それにひも付く顧客を検索するには、

user = (User) session.load(User.class, user.getId());
Set customers = user.getCustomers();
Iterator e = customers.iterator();
while (e.hasNext()) {
    Customer element = (Customer) e.next();
    logger.debug(element);
}

とすればOKです。これに対して、ソート処理など更にクエリをかけるには以下のようにすればOKです。

user = (User) session.load(User.class, user.getId());
Query query = session.createFilter(user.getCustomers(),
        "order by this.name asc"); <-この条件を↑のセットに対して行う
List list = query.list();
Iterator e = list.iterator();
while (e.hasNext()) {
    Customer element = (Customer) e.next();
    logger.debug(element);
}

これでthis.name(CUSTOMER.NAME)でソートをかけることができます。thisはコレクション(customers)の要素customerとなります。

これを使うことで、ユーザクラスにひも付いてる顧客のうち名前が××の顧客、とか有効フラグがたっている顧客のみ、などの検索ができますね。たとえば名前が××の顧客のみ検索、は以下の通り。

Query query = session.createFilter(user.getCustomers(),
        "where this.name=:name").setString("name", "××");
List list = query.list();

発行されたSQLは以下の通り。

select user0_.ID as ID4_0_, user0_.NAME as NAME4_0_, user0_.ADDRESS as ADDRESS4_0_ 
 from Samples.USER user0_ where user0_.ID=?
select customer0_.ID as ID5_, customer0_.USER_ID as USER2_5_, customer0_.NAME as NAME5_
 from Samples.CUSTOMER customer0_ where customer0_.USER_ID = ? and customer0_.NAME=?

ちゃんと検索条件が結合されてからSQLが発行されています。。

これは便利だ。。。。


この記事は

選択肢 投票
おもしろかった 7  
そうでもない 1  

Top / Hibernate / マッピング定義について / 結果にクエリを適用する

現在のアクセス:6796


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-17 (月) 17:05:21 (5092d)