动态SQL
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
create.select(
AUTHOR.FIRST_NAME.concat(AUTHOR.LAST_NAME),
count()
.from(AUTHOR)
.join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID))
.groupBy(AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.orderBy(count().desc())
.fetch();
然而,有趣的是将上述所有表达式视为它们本质:表达式。因此,没有任何东西可以阻止用户提取表达式并从语句外部引用它们。以下语句是完全等效的
SelectField<?>[] select = {
AUTHOR.FIRST_NAME.concat(AUTHOR.LAST_NAME),
count()
};
Table<?> from = AUTHOR.join(BOOK).on(AUTHOR.ID.eq(BOOK.AUTHOR_ID));
GroupField[] groupBy = { AUTHOR.ID, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME };
SortField<?>[] orderBy = { count().desc() };
create.select(select)
.from(from)
.groupBy(groupBy)
.orderBy(orderBy)
.fetch();
public Condition condition(HttpServletRequest request) {
Condition result = noCondition();
if (request.getParameter("title") != null)
result = result.and(BOOK.TITLE.like("%" + request.getParameter("title") + "%"));
if (request.getParameter("author") != null)
result = result.and(BOOK.AUTHOR_ID.in(
select(AUTHOR.ID).from(AUTHOR).where(
AUTHOR.FIRST_NAME.like("%" + request.getParameter("author") + "%")
.or(AUTHOR.LAST_NAME .like("%" + request.getParameter("author") + "%"))
)
));
return result;
}
// And then:
create.select()
.from(BOOK)
.where(condition(httpRequest))
.fetch();
动态 SQL 构建能力可能是使用像 jOOQ 提供的运行时查询模型的最大优势之一。可以动态地创建任意复杂度的查询。在上面的例子中,我们刚刚构造了一个动态的 WHERE 子句。对于任何其他子句也可以这样做,包括动态 FROM 子句(动态 JOIN),或根据需要添加额外的 WITH 子句。
上面的例子使用了可选条件,这是一种将在以下章节中解释的机制。
反馈
您对此页面有任何反馈吗?我们很乐意听到您的声音!