“сверхдинамический” запрос с помощью MyBatis
Вопрос
Есть ли способ создать sql-запрос "на лету" с помощью MyBatis?Конкретизировать:У меня есть запрос, где его часть (но не параметр) должна быть создана во время выполнения:
with dummy (id) as (
values (#{rangeEnd}) union all
select id - 1 from dummy where id - 1 >= #{rangeStart}
).......
Вторая часть может быть использована в качестве параметра, но при попытке выполнить запрос как есть я получаю исключение:
[SQL0584] NULL or parameter marker in VALUES not allowed.
С обычным JDBC я использую MessageFormat
:
PreparedStatement ps = connection.prepareStatement(
MessageFormat.format(MY_QUERY, currentRange.getRangeEnd()))
, но я не нашел способа, как это сделать с помощью MyBatis.
Решение
Это действительно легко (ответ от Dynamic Выберите SQL-заявления с MyBatis ):
with dummy (id) as ( values (${rangeEnd}) union all select id - 1 from dummy where id - 1 >= #{rangeStart} )........
Другие советы
Воспользуйся @SelectProvider
аннотация:
public interface SqlMapper {
static class PureSqlProvider {
public String sql(String sql) {
// Create your query here
return sql;
}
}
@SelectProvider(type = PureSqlProvider.class, method = "sql")
public List<Dummy> select(String sql);
}
Не связан с StackOverflow