首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBI3动态创建WHERE子句

JDBI3动态创建WHERE子句
EN

Stack Overflow用户
提问于 2018-10-18 08:55:09
回答 1查看 2.3K关注 0票数 8

我如何创建动态位置

代码语言:javascript
复制
public interface ThingDAO {
   @SqlQuery("SELECT * FROM things <where>)
   List<Thing> findThingsWhere(@Define("where") String where);
}

JDBI How can I dynamically create a WHERE clause while preventing SQL Injection?

但实际上不是给JDBI3的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-24 16:20:03

在查询中实现动态筛选的主要方法有两种:

  • 使用静态WHERE子句,并使NULL参数表示“不对此参数进行筛选”。我建议您始终先尝试这种方法。
  • 使用模板引擎。这需要时间来设置和验证,并且由于SQL和模板语言的混合,使得查询更难推理。如果静态WHERE子句不适用于您的用例,或者您希望消除多个查询之间的重复,请使用此方法。

静态WHERE子句方法:

代码语言:javascript
复制
SELECT * FROM things
WHERE (:foo IS NULL OR foo_column = :foo)
AND (:bar IS NULL or bar_column = :bar)
  • 如果:foo为null,则things行将不会在foo_column上被过滤。否则,将只返回具有指定:foo值的行。
  • 同样,如果:bar为null,那么things行将不会在bar_column上被过滤。否则,将只返回具有指定:bar值的行。
  • 如果这两个参数都为null,则将返回所有行。

模板引擎法

Jdbi 3只提供简单的模板,可以用您的<where>参数替换@Define("where")

此默认模板引擎可以用任何您喜欢的内容覆盖。Jdbi为StringTemplate 4和Freemarker提供了额外的模板引擎。

StringTemplate 4不再被积极维护,所以我将向您展示Freemarker的示例。

FreeMarker

添加依赖项:

代码语言:javascript
复制
<dependency>
  <groupId>org.jdbi</groupId>
  <artifactId>jdbi3-freemarker</artifactId>
</dependency>

@UseFreemarkerEngine注释可以在SQL对象上使用,这将导致查询首先作为共济会模板呈现。

@UseFreemarkerSqlLocator类似于@UseFreemarkerEngine,但是增加了从类路径上的文件加载@UseFreemarkerEngine的额外好处。这允许将常用的SQL模式重构为可重用的文件,这些文件可以通过#include指令引用。

代码语言:javascript
复制
<#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:

代码语言:javascript
复制
<#macro orderBy field order="ASC">
  ORDER BY ${field} ${order}
</#macro>

util2.ftl:

代码语言:javascript
复制
<#macro groupBy field>
  GROUP BY ${field}
</#macro>
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52870413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档