在 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 提供的简单字符串替换功能。
您必须为 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>
我正在尝试使用 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 提供的简单字符串替换功能。
您必须为 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>