关联属性
在上一篇文档中,我们介绍了标量属性的抓取,在本文中,我们讨论关联属性的抓取。
ORM有两种关联属性:
-
引用关联:关联到单个对象*(或null)*,属性返回类型为实体对象,用于表达一对一和多对一关联。
信息本文用多对一关联属性
Book.store为例。 -
集合关联:关联到 多个对象,属性返回类型为实体集合,用于表达一对多和多对多关联。
信息本文用多对多关联属性
Book.authors为例。
抓取只有id的关联对象
不带任何参数抓取关联对象时,得到的关联对象只有id属性。
多对一: Book.store
- Java
- Kotlin
BookTable book = Tables.BOOK_TABLE;
List<Book> list = sqlClient.createQuery(book)
.where(book.edition().eq(3))
.select(
book.fetch(
Fetchers.BOOK_FETCHER
.allScalarFields()
.store()
)
)
.execute();
System.out.println(toJson(list));
val books = sqlClient
.createQuery(Book::class) {
where(table.edition.eq(3))
select(
table.fetchBy {
allScalarFields()
store()
}
)
}
.execute()
这里,store()表示对多对一关联进行抓取。我们并未为store()指定任何参数,这表示只抓取关联对象的id属性。
生成如下SQL:
select
tb_1_.ID,
tb_1_.NAME,
tb_1_.EDITION,
tb_1_.PRICE,
tb_1_.STORE_ID
from BOOK tb_1_
where tb_1_.EDITION = ?
因为多对一关联Book.store基于真实外键,所以当前表BOOK的外键STORE_ID就是父对象的id。
由于store()抓取只有id属性的关联对象,所以,无需额外的SQL查询,即可根据当前数据的外键直接构建只有id属性的父对象。
输出的返回值如下:
[
{
"id": 3,
"name": "Learning GraphQL",
"edition": 3,
"price": 51.00,
"store": {
"id": 1
}
},
...省略其他对象...
]
多对多: Book.authors
- Java
- Kotlin
BookTable book = Tables.BOOK_TABLE;
List<Book> books = sqlClient
.createQuery(book)
.select(
book.fetch(
Fetchers.BOOK_FETCHER.
.allScalarFields()
.authors()
)
)
.execute();
val books = sqlClient
.createQuery(Book::class) {
where(table.edition.eq(3))
select(
table.fetchBy {
allScalarFields()
authors()
}
)
}
.execute()
这里,authors()表示对多对多关联进行抓取。我们并未为authors()指定任何参数,这表示只抓取关联对象的id属性。
生成两条SQL:
-
查询
Book对象本身select
tb_1_.ID,
tb_1_.NAME,
tb_1_.EDITION,
tb_1_.PRICE
from BOOK as tb_1_
where tb_1_.EDITION = ?