Question

J'ai trois tableaux, avec la structure suivante:

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 être en mesure d'obtenir un PartObject, puis tirez tous ses attributs, classés par le AttributeName dans le tableau 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 son Attribute.AttributeName propriété

  2. Je ne peux pas ajouter la propriété Attribute.AttributeName à l'entité ObjectAttribute parce que je reçois 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 suit:

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.

Voici une décharge sans que la propriété de 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

Était-ce utile?

La solution

Je résolu 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. Je viens d'utiliser ORMExecuteQuery pour obtenir les éléments dans l'ordre, et s'il n'y avait pas d'articles, juste retourné 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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top