使用自定义where条件与JDBI dropwizard

时间:2015-02-20 13:18:17

标签: java sql dropwizard jdbi

我正在尝试使用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

我收到引号问题,因为它已作为String传递。这样我试图为所有查询实现公共where子句代码。 我的问题是 1.如何解决此问题。 这是这样编码的正确方法,还是我们可以使用预备语句。如果是,那么如何。

非常感谢提前:)

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您必须对DAO接口使用注释 @ UseStringTemplate3StatementLocator 。 然后你可以使用&#34; dynamic&#34; sql @UseStringTemplate3StatementLocator public interface UserDao { @SqlQuery("SELECT FROM `t_user` <cond>") @Mapper(UserMapper.class) List<User> fetch(@Bind("cond") String cond); } 语法:

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

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

SolrTemplate