假设我想知道是谁写的CLRS
在书中数据库(表BOOK
, AUTHOR
带连接表BOOK_AUTHOR
).
SelectConditionStep<Record1<String>> query = create
.select(AUTHOR.LASTNAME.as("AuthorName"))
.from(
(
BOOK.leftOuterJoin(BOOK_AUTHOR).on(BOOK.ID.eq(BOOK_AUTHOR.BOOKID))
).leftOuterJoin(AUTHOR).on(AUTHOR.ID.eq(BOOK_AUTHOR.AUTHORID))
)
.where(BOOK.TITLE.eq(CLRS_title))
;
仅选择一本书来匹配整个表的效率有点低。我现在想在比赛前选择那本书。
关于此事的 jOOQ 文档 https://www.jooq.org/doc/3.11/manual/sql-building/table-expressions/nested-selects/让我相信这可能看起来像这样:
Table<Record1<Integer>> clrs = create
.select(BOOK.ID.as("bookID"))
.from(BOOK)
.where(BOOK.TITLE.eq(CLRS_title))
.asTable()
;
SelectJoinStep<Record1<String>> query = create
.select(AUTHOR.LASTNAME.as("AuthorName"))
.from(
(
clrs.leftOuterJoin(BOOK_AUTHOR).on(clrs.field("bookID").eq(BOOK_AUTHOR.BOOKID))
).leftOuterJoin(AUTHOR).on(AUTHOR.ID.eq(BOOK_AUTHOR.AUTHORID))
)
;
但是,这无法编译,因为
Cannot resolve method 'eq(org.jooq.TableField<ch.cypherk.bookdb.public_.tables.records.BookAuthorRecord,java.lang.Integer>)'
在连接条件下。
编写此连接的正确方法是什么?
你遇到的问题
您正在使用派生表取消引用列Table.field(String) https://www.jooq.org/javadoc/latest/org/jooq/TableLike.html#field-java.lang.String-:
clrs.field("bookID")
你要返回的类型是Field<?>
,带有通配符。与任何泛型类型一样,一旦拥有通配符,该类型上的许多操作(但不是全部)将不再可能。拿List<?>
, 例如。您仍然可以致电List<?>.get()
检索一个Object
, 但不是List<?>.add(? element)
. In Field<?>
,你不能再打电话eq()
,除非您将参数转换为原始类型。
您还可以强制您的领域<T>
输入您已经知道的类型,例如通过使用Table.field(String, DataType<T>) https://www.jooq.org/javadoc/latest/org/jooq/TableLike.html#field-java.lang.String-org.jooq.DataType-
clrs.field("bookID", BOOK.ID.getDataType())
研究您的各种选项,您可能会发现最有用的选项
更好地解决您的查询
你真的不需要
- 将子查询分配给局部变量
- 使用派生表来解决您的问题
通常,使用 jOOQ 时,如果您遇到上述派生表的问题,请问自己是否真的没有一个更简单的查询可以代替?
你真正需要的是半连接 https://blog.jooq.org/2015/10/13/semi-join-and-anti-join-should-have-its-own-syntax-in-sql/. Write:
// Assuming this static import
import static org.jooq.impl.DSL.*;
ctx.select(AUTHOR.LASTNAME)
.from(AUTHOR)
.where(AUTHOR.ID.in(
select(BOOK_AUTHOR.AUTHORID)
.from(BOOK_AUTHOR)
.join(BOOK).on(BOOK.ID.eq(BOOK_AUTHOR.BOOKID))
.where(BOOK.TITLE.eq(clrsTitle))
)
.fetch();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)