JDBI3动态创建WHERE子句
JDBI3 dynamically create a WHERE clause
我如何创建动态 where
public interface ThingDAO {
@SqlQuery("SELECT * FROM things <where>)
List<Thing> findThingsWhere(@Define("where") String where);
}
但它实际上不适用于 JDBI3
在查询中实现动态过滤主要有两种方法:
- 使用静态
WHERE
子句,并使 NULL
参数表示 "no filtering on this parameter." 我建议您始终先尝试这种方法。
- 使用模板引擎。这需要时间来设置和验证,并且由于 SQL 和模板语言的混合使得查询更难推理。当静态
WHERE
子句不适用于您的用例,或者您想消除多个查询之间的重复时使用此选项。
静态WHERE
子句方法:
SELECT * FROM things
WHERE (:foo IS NULL OR foo_column = :foo)
AND (:bar IS NULL or bar_column = :bar)
- 如果
:foo
为空,则 things
行将不会在 foo_column
上被过滤。否则,将只返回具有指定 :foo
值的行。
- 同样,如果
:bar
为空,则 things
行将不会在 bar_column
上被过滤。否则,将只返回具有指定 :bar
值的行。
- 如果两个参数都为空,将返回所有行。
模板引擎方法
开箱即用,Jdbi 3 仅提供简单的模板来替换例如<where>
与您的 @Define("where")
参数。
这个默认的模板引擎可以被任何你喜欢的东西覆盖。 Jdbi 为 StringTemplate 4 和 Freemarker 提供了额外的模板引擎。
StringTemplate 4 不再主动维护,所以我将只向您展示 Freemarker 的示例。
FreeMarker
添加依赖:
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-freemarker</artifactId>
</dependency>
@UseFreemarkerEngine
注释可用于 SQL 对象,这会导致查询首先呈现为 Freemarker 模板。
@UseFreemarkerSqlLocator
类似于 @UseFreemarkerEngine
,但具有从类路径上的文件加载 SQL 的额外好处。这允许将常用的 SQL 模式重构为可重用的文件,这些文件可以通过 #include
指令引用。
<#include "/org/jdbi/v3/freemarker/util.ftl">
<#include "util2.ftl">
select name from something
where id in (<#list somethings as something>${something.id}<#sep>, </#list>)
<@groupBy field="name" />
<@orderBy field="name" />
util.ftl:
<#macro orderBy field order="ASC">
ORDER BY ${field} ${order}
</#macro>
util2.ftl:
<#macro groupBy field>
GROUP BY ${field}
</#macro>
我如何创建动态 where
public interface ThingDAO {
@SqlQuery("SELECT * FROM things <where>)
List<Thing> findThingsWhere(@Define("where") String where);
}
但它实际上不适用于 JDBI3
在查询中实现动态过滤主要有两种方法:
- 使用静态
WHERE
子句,并使NULL
参数表示 "no filtering on this parameter." 我建议您始终先尝试这种方法。 - 使用模板引擎。这需要时间来设置和验证,并且由于 SQL 和模板语言的混合使得查询更难推理。当静态
WHERE
子句不适用于您的用例,或者您想消除多个查询之间的重复时使用此选项。
静态WHERE
子句方法:
SELECT * FROM things
WHERE (:foo IS NULL OR foo_column = :foo)
AND (:bar IS NULL or bar_column = :bar)
- 如果
:foo
为空,则things
行将不会在foo_column
上被过滤。否则,将只返回具有指定:foo
值的行。 - 同样,如果
:bar
为空,则things
行将不会在bar_column
上被过滤。否则,将只返回具有指定:bar
值的行。 - 如果两个参数都为空,将返回所有行。
模板引擎方法
开箱即用,Jdbi 3 仅提供简单的模板来替换例如<where>
与您的 @Define("where")
参数。
这个默认的模板引擎可以被任何你喜欢的东西覆盖。 Jdbi 为 StringTemplate 4 和 Freemarker 提供了额外的模板引擎。
StringTemplate 4 不再主动维护,所以我将只向您展示 Freemarker 的示例。
FreeMarker
添加依赖:
<dependency>
<groupId>org.jdbi</groupId>
<artifactId>jdbi3-freemarker</artifactId>
</dependency>
@UseFreemarkerEngine
注释可用于 SQL 对象,这会导致查询首先呈现为 Freemarker 模板。
@UseFreemarkerSqlLocator
类似于 @UseFreemarkerEngine
,但具有从类路径上的文件加载 SQL 的额外好处。这允许将常用的 SQL 模式重构为可重用的文件,这些文件可以通过 #include
指令引用。
<#include "/org/jdbi/v3/freemarker/util.ftl">
<#include "util2.ftl">
select name from something
where id in (<#list somethings as something>${something.id}<#sep>, </#list>)
<@groupBy field="name" />
<@orderBy field="name" />
util.ftl:
<#macro orderBy field order="ASC">
ORDER BY ${field} ${order}
</#macro>
util2.ftl:
<#macro groupBy field>
GROUP BY ${field}
</#macro>