FetchGroup

作为 selectfetch 的替代方法,我们可以使用 FetchGroup 来指定要获取的对象图的哪个部分。

我们可以将 FetchGroup 与查询 Bean 和标准查询一起使用。

FetchGroup 提供了一种干净的方法来将“加载对象图的哪个部分”(查询调整)的定义与查询谓词(查询业务逻辑)的定义分开。

FetchGroup 是不可变的,通常声明为 static final,并且可以组合以生成其他 FetchGroup。

例如,仅顶级选择属性

// immutable and threadsafe

static final QCustomer CUST = QCustomer.alias();

static final FetchGroup<Customer> fetch = QCustomer.forFetchGroup()
    .select(CUST.name, CUST.version, CUST.whenCreated)
    .buildFetchGroup();

...

List<Customer> customers =
  new QCustomer()
    .select(fetch)
    .name.istartsWith("Rob")
    .findList();

上面的 FetchGroup 可以创建,而无需使用查询 Bean,如下所示

static final FetchGroup<Customer> fetch =
    FetchGroup.of(Customer.class, "name, version, whenCreated"); // root level properties

 

例如,选择和获取属性

// immutable and threadsafe

static final QCustomer CUST = QCustomer.alias();
static final QContact  CONT = QContact.alias();

static final FetchGroup<Customer> fetch = QCustomer.forFetchGroup()
    .select(CUST.name, CUST.version, CUST,whenCreated)
    .contacts.fetch(CONT.email)          // fetch the contacts with just their email
    .billingAddress.fetch()              // fetch all properties of billingAddress
    .buildFetchGroup();

...

List<Customer> customers =
  new QCustomer()
    .select(fetch)
    .name.istartsWith("Rob")
    .findList();

可以通过以下方式创建不带查询 Bean 的上面的 FetchGroup

// immutable and threadsafe
static final FetchGroup<Customer> fetch =
   FetchGroup.of(Customer.class)
    .select("name, status")       // root level properties
    .fetch("contacts", "email")   // associated bean properties
    .build();

示例

这是一个更大的示例,获取与相关行、装运、客户、客户的账单地址和客户的联系方式相关的订单。

请注意,我们可以控制在每个路径上获取哪些属性(或全部属性)。

在此示例中,我们有几个 ToMany 路径,并且我们使用 fetchQuery 来明确控制如何将 ORM 查询分解为多个 SQL 查询以构建图。

// immutable and threadsafe

static final QOrder ORD = QOrder.alias();
static final QCustomer CUST = QCustomer.alias();
static final QContact CONT = QContact.alias();

static final FetchGroup<Order> fetch = QOrder.forFetchGroup()
    .customer.fetch(CUST.name, CUST.version, CUST,whenCreated)
    .customer.shippingAddress.fetch()
    .customer.contacts.fetch(CONT.email)                        // a ToMany path
    .lines.fetchQuery()                                         // a ToMany path
    .shipments.fetchQuery()                                     // a ToMany path
    .buildFetchGroup();

...

List<Order> orders =
  new QOrder()
    .select(fetch)
    .status.eq(Order.Status.NEW)
    .findList();