我正在尝试使用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.如何解决此问题。 这是这样编码的正确方法,还是我们可以使用预备语句。如果是,那么如何。
非常感谢提前:)
答案 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提供的简单字符串替换功能。
答案 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