FilterMany

これはOneToManyまたはManyToManyリレーションシップで返されるBeanにフィルタを適用します。

たとえば、顧客がOneToMany注文を持っています。フェッチされる顧客のすべての注文をフェッチする代わりに、先週以降に彼らが出した新しい注文だけをフェッチしたいとします。

filterMany()を使用して、各顧客にフェッチされた注文にフィルタを適用します。

簡単な文字列式を使用したfilterMany
// query customers fetching 'new orders since last week' ...
List<Customer> customers
  = new QCustomer()
  .name.istartsWith("Rob")
  .orders.filterMany("status = ? and orderDate > ?", Order.Status.COMPLETE, lastWeek)
  .findList();

上の例では、バインドパラメータプレースホルダとして?を使用した文字列式を使用しています。これは簡単な式を追加する比較的手軽な方法です。

filterManyに使用するExpressionListを作成する代わりに、文字列の式を使用するのと全く同じクエリを以下に示します。

ExpressionList式を使用したfilterMany
// filter orders - status COMPLETE since last week
ExpressionList<Order> filterOrders = new QOrder()
  .status.eq(Order.Status.COMPLETE)
  .orderDate.greaterThan(lastWeek)
  .getExpressionList();


// query customers fetching 'new orders since last week' ...
List<Customer> customers
  = new QCustomer()
  .name.istartsWith("Rob")                   // (1) filter customers
  .orders.filterMany(filterOrders)           // (2) filter the orders for those customers
  .findList();

顧客とその連絡先を見つけます。最初の名前が「Rob」で始まる連絡先だけに連絡先をフィルタします。

List<Customer> customers =
    new QCustomer()
    .status.eq(Status.NEW)
    .contacts.filterMany("firstName istartsWith ?", "Rob")
    .findList();