FetchGroup
作为 select 和 fetch 的替代方法,我们可以使用 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();