2010-10-15 20 views
14

J'ai trois tableaux, avec la structure suivante:tri sur la colonne dans le tableau Type avec ColdFusion ORM

http://dl.dropbox.com/u/2586403/ORMIssues/TableLayout.png

Les trois objets que je traite sont ici:

http://dl.dropbox.com/u/2586403/ORMIssues/Objects.zip

Je dois pouvoir obtenir un objet PartObject, puis extraire tous ses attributs, triés par nom d'attribut dans la table Types. Voici les problèmes que je suis en cours d'exécution dans:

  1. Je ne peux pas trier les attributs de propriété PartObject par sa propriété de Attribute.AttributeName

  2. Je ne peux pas ajouter la propriété à Attribute.AttributeName l'entité ObjectAttribute parce que j'obtiens une erreur concernant les noms de colonnes. Mise en veille prolongée met l'ID du mauvais côté de la jointure

Voici le fichier journal de mise en veille prolongée montrant la mauvaise requête

10/14 16:36:39 [jrpp-12] HIBERNATE DEBUG - select objectattr0_.ID as ID1116_, objectattr0_.AttributeValue as Attribut2_1116_, objectattr0_.AttributeID as Attribut3_1116_, objectattr0_1_.AttributeName as Attribut2_1117_ from ObjectAttributes objectattr0_ inner join Attributes objectattr0_1_ on objectattr0_.ID=objectattr0_1_.AttributeID 
10/14 16:36:39 [jrpp-12] HIBERNATE ERROR - [Macromedia] [SQLServer JDBC Driver][SQLServer]Invalid column name 'AttributeID'. 
10/14 16:36:39 [jrpp-12] HIBERNATE ERROR - [Macromedia] [SQLServer JDBC Driver][SQLServer]Statement(s) could not be prepared. 

Voici la section incriminée de la requête:

from ObjectAttributes objectattr0_ 
inner join Attributes objectattr0_1_ on objectattr0_.ID=objectattr0_1_.AttributeID 

Il devrait être:

from ObjectAttributes objectattr0_ 
inner join Attributes objectattr0_1_ on objectattr0_.AttributeID=objectattr0_1_.ID 

La propriété AttributeName sur le ObjectAttribute.cfc est celui qui cause le problème:

component output="false" persistent="true" table="ObjectAttributes" 
{ 
     property name="ID" column="ID" generator="native" type="numeric" ormtype="int" fieldtype="id" unsavedvalue="0" ; 
     property name="AttributeValue" type="string" ; 
     property name="Attribute" fieldtype="many-to-one" cfc="Attribute" fkcolumn="AttributeID" fetch="join"; 
     property name="AttributeName" table="Attributes" joincolumn="AttributeID" ; 
} 

J'ai aussi essayé d'utiliser une formule pour obtenir le AttributeName sur l'entité ObjectAttribute, comme ceci:

component output="false" persistent="true" table="ObjectAttributes" 
{ 
    property name="ID" column="ID" generator="native" type="numeric" ormtype="int" fieldtype="id" unsavedvalue="0" ; 
    property name="AttributeValue" type="string" ; 
    property name="Attribute" fieldtype="many-to-one" cfc="Attribute" fkcolumn="AttributeID" fetch="join"; 
    property name="AttributeName" type="string" formula="(SELECT A.AttributeName FROM Attributes A WHERE A.ID = AttributeID)"; 
} 

Cela fonctionne, mais je ne peux pas trier par cette colonne calculée. Si je puis réglez PartObject.cfc comme ceci:

property name="Attributes" cfc="ObjectAttribute" type="array" fkcolumn="ObjectID" fieldtype="one-to-many" orderby="AttributeName"; 

Je reçois les erreurs suivantes dans le journal des hibernatesql:

10/17 16:51:55 [jrpp-0] HIBERNATE DEBUG - select attributes0_.ObjectID as ObjectID2_, attributes0_.ID as ID2_, attributes0_.ID as ID244_1_, attributes0_.AttributeValue as Attribut2_244_1_, attributes0_.AttributeID as Attribut3_244_1_, ((SELECT A.AttributeName FROM Attributes A WHERE A.ID = attributes0_.AttributeID)) as formula25_1_, attribute1_.ID as ID246_0_, attribute1_.AttributeName as Attribut2_246_0_ from ObjectAttributes attributes0_ left outer join Attributes attribute1_ on attributes0_.AttributeID=attribute1_.ID where attributes0_.ObjectID=? order by attributes0_.AttributeName 
10/17 16:51:55 [jrpp-0] HIBERNATE ERROR - [Macromedia][SQLServer JDBC Driver][SQLServer]Invalid column name 'AttributeName'. 
10/17 16:51:55 [jrpp-0] HIBERNATE ERROR - [Macromedia][SQLServer JDBC Driver][SQLServer]Statement(s) could not be prepared. 

est ici une décharge sans cette propriété pour montrer que le reste des relations fonctionnent correctement:

http://dl.dropbox.com/u/2586403/ORMIssues/Dump.pdf

Je ne sais pas comment résoudre ce problème. Toute aide que vous pouvez fournir serait grandement appréciée.

Merci,

Dan

+0

En ce qui concerne 1), pourquoi ne pouvez-vous utiliser seulement l'une des méthodes de tri de cflib .org pour le faire? Quel code utilisez-vous pour conclure "ne peut pas trier par cette colonne calculée"? –

+0

J'utilise 'property name =" Attributs "cfc =" ObjectAttribute "type =" tableau "fkcolumn =" ObjectID "fieldtype =" un-à-plusieurs "orderby =" AttributeName ";' essayer et ordonner par le calcul colonne. Cela me donne le dernier message d'erreur répertorié ci-dessus. –

+6

Avez-vous/pourriez-vous utiliser ORMExecuteQuery et HQL pour avoir plus de contrôle sur ORDER BY? –

Répondre

0

Je résolus celui-ci avec l'aide de Sam, en mettant en place une méthode dans mon service qui a renvoyé les éléments dans l'ordre que je voulais. J'ai juste utilisé ORMExecuteQuery pour obtenir les éléments dans le bon ordre, et s'il n'y avait aucun élément, je viens de retourner un tableau vide.

La dernière méthode ressemblait à ceci, lorsque les spécifications sont définies directement dans l'objet dans l'ordre que je veux les:

/** 
@hint Gets a SpecGroups object based on ID. Pass 0 to retrieve a new empty SpecGroups object 
@ID the numeric ID of the SpecGroups to return 
@roles Admin, User 
*/ 
remote ORM.SpecGroups function getSpecGroup(required numeric ID){ 
    if(Arguments.ID EQ 0){ 
     return New ORM.SpecGroups(); 
    }else{ 
     LOCAL.SpecGroup = EntityLoadByPK("SpecGroups", Arguments.ID); 
     LOCAL.SpecsInGroup = ORMExecuteQuery("SELECT Spec FROM SpecInGroup G WHERE G.SpecGroupID = :GroupID ORDER BY SpecLabel, SpecName", {GroupID = LOCAL.SpecGroup.getID()}); 
     LOCAL.SpecGroup.setSpecifications(LOCAL.SpecsInGroup); 
     return LOCAL.SpecGroup; 
    } 
}