别名

设置要用于基本表的表别名。

List<Customer> customers =
    new QCustomer()
      .alias("cust")
      .name.istartsWith("Rob")
      .findList();
select cust.id, cust.inactive, cust.name, cust.registered, ...
from customer cust
where lower(cust.name) like ? escape'|' ; --bind(rob%)

别名的典型用法是在用作子查询时。

Query<Order> subQuery = new QOrder()
  .alias("sub")
  .select("id").where().raw("sub.customer_id = main.id")
  .query();

List<Customer> customers = new QCustomer()
    .alias("main")
    .query().where().exists(subQuery)
    .findList();
select main.id, main.inactive, main.name, main.registered, ...
from customer main
where  exists (select sub.id from orders sub where sub.customer_id = main.id)

asDraft

用于从其草稿表(而不是已发布表)中获取 @Draftable 实体。

Document documentDraft =
  new QDocument()
    .asDraft()
    .id.equalTo(42)
    .findOne();

asOf 时间戳

对于具有 @History 的实体,获取给定时间戳AS OF的实体。

Timestamp timeInPast = ...;

List<Customer> customers
  = new QCustomer()
  .asOf(timeInPast)
  .findList();

自动调整

启用或禁用自动查询调整。

List<|Customer> customers = new QCustomer() .setAutoTune(true) // 自动调整查询 .status.equalTo(Status.NEW) .findList();

bufferFetchSizeHint

一个提示,对于 JDBC 来说,它转换为 Statement.fetchSize()。

向 JDBC 驱动程序提供一个提示,说明当 ResultSet 需要更多行时,应从数据库中获取的行数。

disableLazyLoading

禁用任何原本会发生的延迟加载。相反,未加载的属性将返回 null。

disableReadAuditing

禁用此查询的读取审计。请参阅 读取审计

当查询不是用户发起的查询,而是应用程序中加载缓存或文档存储等内部处理的一部分时,应使用此方法。在这些情况下,我们不希望查询成为读取审计的一部分。

distinct

使查询使用 sql distinct

List<String> lastNames =
  new QContact()
   .setDistinct(true)
   .select("lastName")
   .email.isNull()
   .findSingleAttributeList();
int count =
  new QCustomer()
      .setDistinct(true)
      .select("anniversary")
      .status.equalTo(Customer.Status.NEW)
      .findCount();
select count(distinct t0.anniversary) from customer t0 where t0.status = ?
// partially loaded beans without Id properties
// ... not persistable, no lazy loading etc

List<Customer> beans =
  new QContact()
      .setDistinct(true)
      .select("lastName, dateOfBirth")
      .findList();

forUpdate

使用 FOR UPDATE 执行查询,该查询将对获取的行保持锁定。

try (Transaction txn = database.beginTransaction()) {

  Customer customer =
    new QContact()
    .forUpdate()
    .email.equalTo("[email protected]")
    .findOne();


  customer.setName("a better name");
  customer.save();

  txn.commit();
}

includeSoftDeletes

设置为 true 以包括软删除的行。请参阅 软删除

lazyLoadBatchSize

将其设置为调整延迟加载批处理大小,该大小默认设置为 10

persistenceContextScope

通常查询使用 事务作用域持久化上下文 运行。使用此功能,我们可以将对象图设置为 QUERY,该对象图将是数据库中的最新数据,忽略 [事务] 持久化上下文中存在的任何 bean。

try (Transaction txn = database.beginTransaction()) {

  // when customer is loaded it then is referenced in the
  // transaction scoped persistence context (aka L1 cache)
  Customer loaded = Customer.find.byId(42)


  // fetch this same customer but we want to ignore the L1 cache
  // such that we get a "fresh" version of its data

  Customer customer =
    new QCustomer()
      .id.equalTo(42)
      .setUseCache(false)                        // ignore L2 cache
      .setPersistenceContextScope(QUERY)         // ignore L1 cache
      .findOne();


  ...

  txn.commit();
}

readOnly

查询返回被视为 只读 的 bean,调用 setter 方法将引发异常。