2010-10-15 9 views
14

Mam trzy tabele, o następującej strukturze:Sortowanie kolumna w tabeli z ColdFusion typu ORM

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

Trzy obiekty mam do czynienia tutaj:

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

Potrzebuję móc uzyskać PartObject, a następnie wyciągnąć wszystkie jego atrybuty, posortowane według AttributeName w tabeli Types. Oto problemy biegnę do:

  1. nie mogę uporządkować własność atrybutów PartObject jego własności Attribute.AttributeName

  2. nie mogę dodać właściwość Attribute.AttributeName do Obiekt ObjectAttribute, ponieważ pojawia się błąd dotyczący nazw kolumn. Hibernacja jest wprowadzenie identyfikatora po niewłaściwej stronie przyłączyć

Oto plik dziennika hibernacji pokazujące złe zapytanie

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. 

Oto odcinek wykraczająca zapytania:

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

Powinno być:

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

Obiekt AttributeName na ObjectAttribute.cfc jedną przyczyną problemu:

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" ; 
} 

Ja również próbowałem przy użyciu formuły, aby uzyskać attributeName na jednostkę ObjectAttribute, tak:

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

To działa, ale nie mogę sortować według tej kolumny obliczeniowej. Gdybym wtedy dostosować PartObject.cfc tak:

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

otrzymuję następujące błędy w dzienniku 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. 

Oto zrzut bez że właściwość, aby pokazać, że reszta relacji działają prawidłowo:

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

nie mam pojęcia, jak rozwiązać ten problem. Każda pomoc, którą możesz zapewnić, byłaby bardzo doceniana.

Dzięki,

Dan

+0

Odnośnie 1), dlaczego nie można po prostu użyć jednej z metod sortowania z cflib .org to zrobić? Jakiego kodu używasz do podsumowania "nie można sortować według tej kolumny obliczeniowej"? –

+0

Używam 'property name =" Atrybuty "cfc =" ObjectAttribute "type =" array "fkcolumn =" ObjectID "fieldtype =" jeden-do-wielu "orderby =" AttributeName ";' aby spróbować i uporządkować według obliczeń kolumna. To daje mi ostatni komunikat o błędzie wymieniony powyżej. –

+6

Czy możesz/możesz użyć ORMExecuteQuery i HQL, aby uzyskać większą kontrolę nad ORDER BY? –

Odpowiedz

0

I rozwiązać ten jeden z pomocy Sama, poprzez utworzenie metody w mojej służbie, że zwracany elementy w kolejności chciałem. Właśnie użyłem ORMExecuteQuery, aby uzyskać pozycje we właściwej kolejności, a jeśli nie było żadnych elementów, po prostu zwrócono pustą tablicę.

Ostateczny sposób wyglądało to, gdzie specyfikacje są ustawione bezpośrednio w obiekcie w kolejności chcę je:

/** 
@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; 
    } 
}