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.

Foi útil?

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
scroll top