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

動的クエリには Bind の代わりに Define を使用します。

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 が @Define を使用して提供する単純な文字列置換機能とは対照的に、動的に SQL を生成できる JDBI 用の Freemarker 統合モジュールを作成しました。

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

于 2015-03-05T18:01:43.597 に答える