|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Hello !
J'aimerais avoir votre avis sur ce point: postgresql propose une fonction spécifique qui s'appelle "ilike" qui est semblable à un like dans une requête mais en insensible à la casse. Ma question est comment puis-je faire pour l'utiliser au sein de QxOrm, je comprends bien que l'objectif de QxOrm n'est pas d'implémenter ces fonctions spécifiques, mais du coup, c'est un peu délicat et je préfère demander des avis avant de me décider.... Plus généralement et idéalement, j'aimerais faire un LIKE insensible à la casse qui soit indépendant du SGBD, mais ma question s'étend également à d'autres fonctions spécifiques au langage comme "UPPER" etc... Je pourrais utiliser une requête brute par le biais de QxQuery, mais ça me semble pas terrible car ça m'empêche d'utiliser ce que tu as fait avec la syntaxe des requêtes du type query.where("toto").like("tata%"); Merci par avance ! |
|
|
00
|
|
|
#2 | ||||||||||
|
Membre Expert
![]() ![]() Inscription : avril 2010 Messages : 331 ![]() |
![]() C'est une excellente question Et je pense que je vais l'ajouter dans la FAQ si on arrive à faire quelque chose de sympa. Je pense que tu peux essayer de surcharger la classe qx::QxSqlQuery pour ajouter tes propres fonctionnalités (spécifiques à un SGBD par exemple). Chaque élément SQL doit implémenter l'interface qx::dao::detail::IxSqlElement. Tu peux donc te créer tes propres éléments SQL. Par exemple, si on veut implémenter ta fonction ILIKE, on pourrait procéder comme ceci : * fichier MySqlElementILIKE.h : Code :
Code :
Code :
Code :
Code :
__________________
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost. Tutoriel qxBlog : gestion de blogs en C++/Qt. Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt. |
||||||||||
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Réponse très intéressante !!
Je vais regarder ça, après réflexion, ce que tu proposes me semble tout à fait bien Reste à savoir où je fais ma spécialisation car l'idée est quand même que mon logiciel reste autant compatible que possible avec les autres SGBD. Peut être faudrait-il un concept supplémentaire: un genre de propriété fallbackTo(&This::like) qui retombe dans une fonctionnalité plus compatible quand "ilike" n'est pas géré (dans le cas présent: like). Qu'en penses-tu ? |
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() ![]() Inscription : avril 2010 Messages : 331 ![]() |
Citation:
Mais bon, tu peux facilement le faire je pense : à toi d'organiser ton code pour le rendre +/- compatible avec les autres SGBD. Au lieu de la classe MySqlQuery telle que je te l'ai écrite, tu fais une interface (IMySqlQuery), et les fonctions spécifiques que tu ajoutes, tu les mets en virtual, par exemple : Code :
Ensuite, la classe MySqlQuery n'hérite plus de qx::QxSqlQuery mais de ton interface IMySqlQuery : tu peux en faire une pour postgres, une pour mysql, une pour oracle, etc...
__________________
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost. Tutoriel qxBlog : gestion de blogs en C++/Qt. Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt. |
|||
|
|
00
|
|
|
#5 | ||
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Ok, ça me semble très bien, je vais analyser ça et le tester.
Par contre, peux tu m'expliquer un peu ce que fait cette fonction resolve ? Et en particulier: Code :
|
||
|
|
00
|
|
|
#6 | ||||
|
Membre Expert
![]() ![]() Inscription : avril 2010 Messages : 331 ![]() |
Citation:
1- la génération de la chaîne de caractères à envoyer : c'est la méthode toString() de l'interface qui gère ça ; 2- le binding des valeurs associées aux paramètres de la requête SQL (placeholder) : c'est la méthode resolve() de l'interface qui gère ça. Pour cette 2ème phase, QxOrm propose plusieurs syntaxes pour l'écriture des requêtes, c'est détaillé dans la FAQ (http://www.qxorm.com/qxorm_fr/faq.html#faq_210), voici un extrait : Citation:
Code :
__________________
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost. Tutoriel qxBlog : gestion de blogs en C++/Qt. Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt. |
||||
|
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Pour info, je vais également essayer de concevoir l'opérateur UPPER, afin de pouvoir écrire ce type de requete:
Code :
SELECT * FROM Patient WHERE UPPER(Patient.name) = :patientLastName |
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() ![]() Inscription : avril 2010 Messages : 331 ![]() |
Citation:
Code :
return "UPPER(" + sColumn + ") = " + sKey;
__________________
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost. Tutoriel qxBlog : gestion de blogs en C++/Qt. Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt. |
|
|
|
00
|
|
|
#9 |
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Pour information, ce que tu m'as donné fonctionne très bien, mais il y a quand même un souci.
Vu que les mots clés or_(...) and_, etc... renvoient une référence vers l'objet qx::SqlQery et non pas ma classe, je suis obligé de faire ma requête en plusieurs temps... |
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() ![]() Inscription : avril 2010 Messages : 331 ![]() |
Citation:
http://www.qxorm.com/version/QxOrm_1.2.5_BETA_06.zip Normalement ton compilateur C++ devrait supporter les types de retour covariant (tous les compilateurs "récents" le supportent), donc ça devrait fonctionner. Avec cette version BETA, tu changes rien à ton code, et tu ajoutes juste à ta classe : * dans le .h : QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_HPP(MyClassName) * dans le .cpp : QX_SQL_QUERY_DERIVED_IMPL_COVARIANT_RETURN_TYPE_CPP(MyClassName) Avec ça, tu pourras écrire ta requête normalement Tiens moi au courant stp pour me dire si ça fonctionne bien ou pas...
__________________
Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost. Tutoriel qxBlog : gestion de blogs en C++/Qt. Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt. |
|
|
|
00
|
|
|
#11 |
|
Membre à l'essai
![]() Inscription : juin 2008 Messages : 142 ![]() |
Je vais tester ça très bientôt ! Merci beaucoup !
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com