通常、ユーザクラスを検索して、それにひも付く顧客を検索するには、
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が発行されています。。
これは便利だ。。。。
この記事は
現在のアクセス:6872