查询 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