查询 Bean

查询 Bean 是可选的,但它们提供了一种很好的方式来编写具有类型安全编译时检查的查询。它们还易于使用和学习,在属性和表达式上具有IDE 自动完成功能。

查询 Bean 是使用 Java 注解处理 (APT) 或 Kotlin 注解处理 (KAPT) 生成的。

对于每个实体,都会生成一个查询 Bean,其名称相同,但前缀为Q。因此,对于名为Customer的实体 Bean,将生成一个名为QCustomer的查询 Bean。

当实体 Bean 模型发生更改时,查询 Bean 会重新生成,并且作为开发人员,我们可以在应用程序查询上获得编译时检查 - 如果我们的查询不再对模型有效,我们将收到编译时错误。

示例
Contact contact =
  new QContact()                                // Contact query bean
    .email.equalTo("[email protected]")               // type safe expression
    .findOne();                                 // with IDE auto-completion
List<Customer> customers =
  new QCustomer()                                // Customer query bean
    .status.equalTo(Status.NEW)
    .billingAddress.city.equalTo("Auckland")     // joins automatically added
    .contacts.isEmpty()                          // to support expressions
    .findList();

APT / KAPT (生成查询 Bean)

要生成Java查询 Bean,我们使用io.ebean:querybean-generator Java 注解处理器,要生成Kotlin查询 Bean,我们使用io.ebean:kotlin-querybean-generator

使用 Maven 生成

有关如何使用 maven 生成查询 Bean 的详细信息,请参阅文档 / 入门 / maven

使用 Gradle 生成

有关如何使用 gradle 生成查询 Bean 的详细信息,请参阅文档 / 入门 / gradle

增强

请注意,在 12.1.8 版本之前,我们需要编辑一个 src/main/resources/ebean.mf 清单文件,以指定应针对查询 Bean 增强哪些包的 querybean-packages。从 12.1.8 版本开始,不再需要这样做。

示例(12.1.8 之前)
entity-packages: org.example.domain
transactional-packages: org.example
querybean-packages: org.example

警告 - 重构重命名

重构重命名实体 Bean

当我们在 IDE 中重构重命名实体 Bean 时,我们应触发查询 Bean 的 build all。这是因为旧 Bean 名称的查询 Bean 会保留到下一次 build all 为止。

一旦我们执行 build all,这将有效地删除旧查询 Bean 并生成新的查询 Bean。此时,我们会收到编译器错误,提示我们需要调整的查询(使用新的查询 Bean 名称)。

Groovy Spock

在 Spock 测试中使用查询 Bean 时,我们可能需要在 @CompileStatic 块中使用它们。

@CompileStatic
static def findCount(String name) {
  return new QDbSample().name.eq(name).findCount()
}

然后,我们可以在 Spock 测试中使用帮助程序方法,如下所示

...
then:
  // this line NPEs
  findCount('fred') == 1