La ligne suivante ne devrait-elle pas renvoyer une erreur au lieu de l'accepter ?
Pourquoi devrait-il en être ainsi ? DSL.condition(String)
fait partie de la API SQL simple qui vous permet de passer n'importe quel fragment de chaîne SQL à un élément de requête jOOQ, y compris :
- Fragments SQL simples
- Expressions complexes et spécifiques au fournisseur
- Erreurs de syntaxe, si vous voulez
Il n'y a pas de validation de ce que vous mettez à l'intérieur d'un simple fragment SQL. C'est la base de données qui validera la requête. Mais jOOQ ne sait pas si, par hasard, il y a un fragment SQL simple. asd
dans votre base de données.
Existe-t-il un moyen de valider la grammaire de la condition à l'aide de JOOQ ?
Il y a un projet expérimental API d'analyseur syntaxique dans jOOQ 3.9, qui est disponible par l'intermédiaire de DSLContext.parser()
. Il permet d'analyser les chaînes SQL et de construire des arbres d'expression à partir de celles-ci. Dans ce cas, en effet, asd
sera un jeton non reconnu et une exception sera levée.
Vous pouvez l'utiliser comme tel :
Condition condition =
ctx.parser().parseCondition("field_name > 10 asd field_name1 <= 20");
Mais comme je l'ai dit, à partir de la version 3.9 de jOOQ, il s'agit d'une version expérimentale qui comporte encore de nombreux bogues. La version 3.10 de jOOQ supprimera son statut de version expérimentale.
De plus, contrairement à un addLimit, les valeurs ne sont pas remplacées par des ?
Car c'est ainsi que fonctionne l'API SQL ordinaire. Si vous vouliez des variables de liaison, vous auriez pu écrire :
Condition condition = DSL.condition("field_name > ? asd field_name1 <= ?", 10, 20);
Ou bien :
Condition condition =
DSL.condition("field_name > {0} asd field_name1 <= {1}", val(10), val(20));