consulta “superdinâmica” com MyBatis
Pergunta
Existe uma maneira de criar consultas SQL dinamicamente com MyBatis?Para concretizar:Tenho uma consulta, onde parte dela (mas não o parâmetro) precisa ser criada em tempo de execução:
with dummy (id) as (
values (#{rangeEnd}) union all
select id - 1 from dummy where id - 1 >= #{rangeStart}
).......
A segunda parte pode ser usada como parâmetro, mas, ao tentar a consulta como está, recebo uma exceção:
[SQL0584] NULL or parameter marker in VALUES not allowed.
Com JDBC simples eu uso MessageFormat
:
PreparedStatement ps = connection.prepareStatement(
MessageFormat.format(MY_QUERY, currentRange.getRangeEnd()))
, mas não encontrei uma maneira de fazer isso com MyBatis.
Solução
É muito fácil (resposta de Instruções SQL de seleção dinâmica com MyBatis):
with dummy (id) as ( values (${rangeEnd}) union all select id - 1 from dummy where id - 1 >= #{rangeStart} ).......
Outras dicas
Usar @SelectProvider
anotação:
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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow