2015-02-20 3 views
2

Я пытаюсь изучить JDBI с dropwizard, мой код custome выглядит следующим образом.Использовать обычай, когда условие с 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 [email protected]\''' at line 1 

Я получаю вопросы котировки, как это было принято в качестве String. Таким образом, я пытаюсь достичь общего, где код предложения для всех запросов. Мои вопросы: 1. Как решить эту проблему. 2. Является ли это правильным способом кодирования такого типа, или мы можем использовать подготовленный оператор. Если да, то как.

Большое спасибо заранее :)

ответ

4

Используйте Define вместо Bind для динамических запросов.

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

Пробовал и получаю ошибку org.skife. jdbi.v2.exceptions.UnableToExecuteStatementException: Невозможно выполнить, ни один именованный параметр не соответствует «cond», и не установлен позиционный параметр для места 0 (который равен 1 в схеме JDBC «Начало на схеме 1»). [statement: "SELECT FROM' t_user': cond ", расположенный:" SELECT FROM 't_user': cond", переписан: "/ * UserDao.fetch */SELECT FROM' t_user'? ", arguments: {positional: {} , называется: {}, видоискатель: []}] –

+0

'@ UseStringTemplate3StatementLocator общедоступный интерфейс UserDao { @SqlQuery (" SELECT * FROM t_user ") @Mapper (UserMapper.class) Список выборки (@Define (" cond ") String cond); } ' –

0

Я написал модуль интеграции Freemarker для JDBI, который может динамически генерировать SQL, в отличие от простой функциональности замены строки JDBI предусматривает использование @Define.

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

0

Вы должны использовать аннотацию @ UseStringTemplate3StatementLocator для интерфейса DAO. Затем вы можете использовать "динамический" 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> 
Смежные вопросы