3 votes

Comment vérifier si la condition d'une clause WHERE est VALIDE ou non en utilisant JOOQ ?

Supposons que nous ayons un fragment SQL comme ci-dessous :

String condition = "field_name > 10 asd field_name1 <= 20"

La ligne suivante ne devrait-elle pas renvoyer une erreur au lieu de l'accepter ?

query.addConditions(DSL.condition(condition));

Existe-t-il un moyen de VALIDER la grammaire de la condition en utilisant JOOQ ? De plus, contrairement à un addLimit, les valeurs ne sont pas remplacées par des ?

1voto

Lukas Eder Points 48046

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));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X