Index: topia/doc/PersistenceImplantationJDBCMultiTable.rst diff -u topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.1 topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.2 --- topia/doc/PersistenceImplantationJDBCMultiTable.rst:1.1 Wed Aug 24 16:17:38 2005 +++ topia/doc/PersistenceImplantationJDBCMultiTable.rst Fri Aug 26 18:15:42 2005 @@ -3,8 +3,8 @@ ============================================== :Authors: Benjamin POUSSIN -:Version: $Revision: 1.1 $ -:Date: $Date: 2005/08/24 16:17:38 $ +:Version: $Revision: 1.2 $ +:Date: $Date: 2005/08/26 18:15:42 $ L'implantation avec une seul table pour toutes les entités a des limites du au base de données qui ne support pas completement le SQL standard. @@ -71,3 +71,51 @@ - topia_isDeleted bool # si vrai l'objet n'existe plus +Les requetes +============ + +Si on a le model suivant:: + + Company 1----* Employe + | + contrat + +Pour faire les requetes, pour tous les elements simples (int, string, double, boolean, +...) une requete SQL simple suffit. Des que l'on arrive sur les classes +d'association, il faut traiter autre, car, l'information est dans une autre +table. + +Pour cela, il faut faire une analyse en Java de la requete:: + + SELECT * FROM o.cl.entities.Employe as E + WHERE E.name = 'poussin' AND E.company.name = 'truc'; + +Dans ce cas, il faut rechercher la classe de E, avec cette classe il faut +rechercher dans les metaInfo le type de l'attibut company, si l'attribut est +géré par une classe d'association, il faudra faire une sous requete pour +rechercher les companies qui s'attisfont:: + + company.name = 'truc' + +et qui ont dans la classe d'association E comme element + +Ce qui pourrait donner:: + + SELECT * FROM o.cl.entities.Employe as E + WHERE E.name = 'poussin' AND E.id in + (SELECT id FROM o.cl.entities._asso_.EmployeCompany as EC, + o.cl.entities.Company as C + WHERE EC.company = C.id AND EC.employe = E.id AND C.name = 'true' + ); + +Bien sur il faut faire ca de facon recursive, car on pourrait avoir:: + + SELECT * FROM o.cl.entities.Employe as E + WHERE E.entity1.entity2.entity3.att = 'value; + +Il faut faire aussi attention, car on peut vouloir utiliser une classe +d'association pour elle-meme, et dans ce cas, la liaison n'est pas fait par +une classe d'association mais par la classe souhaité directement:: + + SELECT * FROM o.cl.entities.Employe as E + WHERE E.contrat.fonction = 'commercial';