Requête « super-dynamique » avec MyBatis
Question
Existe-t-il un moyen de créer une requête SQL à la volée avec MyBatis ?Pour concrétiser :J'ai une requête dont une partie (mais pas le paramètre) doit être créée au moment de l'exécution :
with dummy (id) as (
values (#{rangeEnd}) union all
select id - 1 from dummy where id - 1 >= #{rangeStart}
).......
La deuxième partie peut être utilisée comme paramètre, mais lorsque j'essaie la requête telle quelle, j'obtiens une exception :
[SQL0584] NULL or parameter marker in VALUES not allowed.
Avec JDBC simple, j'utilise MessageFormat
:
PreparedStatement ps = connection.prepareStatement(
MessageFormat.format(MY_QUERY, currentRange.getRangeEnd()))
, mais je n'ai pas trouvé de moyen de le faire avec MyBatis.
La solution
C'est vraiment simple (réponse de Instructions SQL de sélection dynamique avec MyBatis):
with dummy (id) as ( values (${rangeEnd}) union all select id - 1 from dummy where id - 1 >= #{rangeStart} ).......
Autres conseils
Utiliser @SelectProvider
annotation:
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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow