2

我正在尝试使用 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. 这样编码是否合适,或者我们可以使用准备好的语句。如果是,那么如何。

非常感谢提前:)

4

3 回答 3

4

对动态查询使用定义而不是绑定。

public interface UserDao {
 @SqlQuery("SELECT * FROM t_user :cond")
 @Mapper(UserMapper.class)
 List<User> fetch(@Define("cond") String cond);
}
于 2015-02-20T14:08:12.503 回答
1

您必须对 DAO 接口使用注解@UseStringTemplate3StatementLocator<arg>然后你可以使用带有语法的“动态”sql :

@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>
于 2015-06-13T14:29:15.620 回答
0

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

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

于 2015-03-05T18:01:43.597 回答