在 JDBI dropwizard 中使用自定义 where 条件

Use custom where condition with JDBI dropwizard

我正在尝试使用 dropwizard 探索 JDBI,我的客户代码如下。

public interface UserDao {
@SqlQuery("SELECT FROM `t_user` :cond")
@Mapper(UserMapper.class)
List<User> fetch(@Bind("cond") String cond);
}

并尝试使用以下代码进行调用

Application.getJdbi().onDemand(UserDao.class).fetch("where logon_id="+p.getEmail()+"'");

并得到以下问题

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM `t_user` 'where logon_id=sanjaypatel2525@gmail.com\''' at line 1

我遇到了引号问题,因为这是作为字符串传递的。通过这种方式,我试图为所有查询实现通用的 where 子句代码。 我的问题是 1.如何解决这个问题。 2. 这是编写这样的代码的正确方法吗,或者我们可以使用准备好的语句。如果是那么如何。

非常感谢:)

对动态查询使用 Define 而不是 Bind。

public interface UserDao {
 @SqlQuery("SELECT * FROM t_user :cond")
 @Mapper(UserMapper.class)
 List<User> fetch(@Define("cond") String cond);
}

我已经为 JDBI 编写了一个 Freemarker 集成模块,它可以动态生成 SQL,而不是 JDBI 使用 @Define 提供的简单字符串替换功能。

https://github.com/jhsheets/jdbi-freemarker

您必须为 DAO 接口使用注解 @UseStringTemplate3StatementLocator。 然后你可以使用 "dynamic" sql 和 <arg> 语法:

@UseStringTemplate3StatementLocator
public interface UserDao {
   @SqlQuery("SELECT FROM `t_user` <cond>")
   @Mapper(UserMapper.class)
   List<User> fetch(@Bind("cond") String cond);
}

为了工作@UseStringTemplate3StatementLocator 注释项目需要antlr:stringtemplate maven 依赖:

<dependency>
  <groupId>antlr</groupId>
  <artifactId>stringtemplate</artifactId>
  <version>3.0</version>
</dependency>