Consulta "super-dinámica" con MyBatis
Pregunta
¿Hay manera de crear una consulta de SQL sobre la mosca con MyBatis?Para concretar: Tengo una consulta, donde se debe crear parte de él (pero no parámetro) en el tiempo de ejecución:
with dummy (id) as (
values (#{rangeEnd}) union all
select id - 1 from dummy where id - 1 >= #{rangeStart}
).......
La segunda parte se puede utilizar como parámetro, pero, al intentar la consulta, ya que es una excepción:
[SQL0584] NULL or parameter marker in VALUES not allowed.
con plano JDBC I Uso MessageFormat
:
PreparedStatement ps = connection.prepareStatement(
MessageFormat.format(MY_QUERY, currentRange.getRangeEnd()))
, pero no he encontrado una manera de hacerlo con MyBatis.
Solución
Es realmente fácil (respuesta de Dinámico Seleccionar sentencias SQL con MyBatis ):
with dummy (id) as ( values (${rangeEnd}) union all select id - 1 from dummy where id - 1 >= #{rangeStart} ).......
Otros consejos
Utilice la anotación de @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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow