普通属性
抓取标量字段
标量字段即数据库表中所有非关联字段。以抓取书籍名称为例:
- Java
- Kotlin
BookTable book = Tables.BOOK_TABLE;
List<Book> books = sqlClient
.createQuery(book)
.select(
book.fetch(
Fetchers.BOOK_FETCHER.name()
)
)
.execute();
val books = sqlClient
.createQuery(Book::class) {
where(table.edition.eq(3))
select(
table.fetchBy {
name()
}
)
}
.execute()
备注
对Java而言,Annotation processor会为每一个实体接口自动生成一个Fetcher类,在这个例子中,就是BookFetcher
生成的SQL如下:
select
tb_1_.ID,
tb_1_.NAME
from BOOK as tb_1_
where tb_1_.EDITION = ?
备注
Java代码没有调用BookFetcher的id()
方法,但是,我们看到SQL语句仍然查询了对象的id属性。
id属性被特殊对待,总是会被查询,并不受对象抓取器的控制。
事实上,自动生成BookFetcher类中也没有id()
方法,因为不需要。
打印的结果如下(原输出是紧凑的,为了方便阅读,这里进行了格式化):
[
{
"id":3,
"name":"Learning GraphQL"
},
...省略其他对象...
]
抓取多个字段
- Java
- Kotlin
BookTable book = Tables.BOOK_TABLE;
List<Book> books = sqlClient
.createQuery(book)
.select(
book.fetch(
Fetchers.BOOK_FETCHER
.name()
.edition()
)
)
.execute();
val books = sqlClient
.createQuery(Book::class) {
where(table.edition.eq(3))
select(
table.fetchBy {
name()
edition()
}
)
}
.execute()
信息
对象抓取器是不可变对象,每一次链式调用都会返回一个新的对象抓取器。
即,上述Java代码中
Fetchers.BOOK_FETCHER
Fetchers.BOOK_FETCHER.name()
Fetchers.BOOK_FETCHER.name().edition()
是三个不同的对象抓取器,每一个都是不可变的。
对象抓取器是不可变对象,所以你可以借助静态变量随意共享对象抓取器。
生成的SQL如下:
select
tb_1_.ID,
tb_1_.NAME,
tb_1_.EDITION
from BOOK as tb_1_
where tb_1_.EDITION = ?
打印的结果如下(原输出是紧凑的,为了方便阅读,这里进行了格式化):
[
{
"id":3,
"name":"Learning GraphQL",
"edition":1
},
...省略其他对象...
]