2010-10-15 2 views
14

ho tre tabelle, con la seguente struttura:ordinamento su colonna in Tipo Tavolo con ColdFusion ORM

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

I tre oggetti ho a che fare sono qui:

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

Devo essere in grado di ottenere un oggetto PartObject e quindi estrarre tutti i suoi attributi, ordinati per AttributeName nella tabella Tipi. Qui ci sono i problemi che sto funzionando in:

  1. non posso ordinare la proprietà Attributi a PartObject dalla sua proprietà Attribute.AttributeName

  2. non posso aggiungere la proprietà Attribute.AttributeName a l'entità ObjectAttribute perché ottengo un errore relativo ai nomi delle colonne. Hibernate sta mettendo l'ID sul lato sbagliato del join

Ecco il file di log di ibernazione che mostra il cattivo interrogazione

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. 

Ecco la sezione incriminata della query:

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

Dovrebbe essere:

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

La proprietà AttributeName sul ObjectAttribute.cfc è quello che causa il problema:

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

Ho anche provato ad utilizzare una formula per ottenere l'AttributeName sull'entità ObjectAttribute, in questo modo:

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

Funziona, ma non posso ordinare in base a quella colonna calcolata. Se io quindi regolare PartObject.cfc in questo modo:

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

Ottengo i seguenti errori nel registro 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. 

Ecco una discarica senza quella proprietà per mostrare che il resto dei rapporti funzionino correttamente:

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

non ho idea di come risolvere questo problema. Qualsiasi aiuto tu possa fornire sarebbe molto apprezzato.

Grazie,

Dan

+0

Per quanto riguarda 1), perché non si può semplicemente utilizzare uno dei metodi di ordinamento da cflib .org per farlo? Quale codice stai usando per concludere "impossibile ordinare secondo quella colonna calcolata"? –

+0

Sto usando 'property name =" Attributes "cfc =" ObjectAttribute "type =" array "fkcolumn =" ObjectID "fieldtype =" one-to-many "orderby =" AttributeName ";' per provare e ordinare dal calcolo colonna. Questo mi dà l'ultimo messaggio di errore sopra elencato. –

+6

Hai/potresti usare ORMExecuteQuery e HQL per ottenere più controllo su ORDER BY? –

risposta

0

ho risolto questo con l'aiuto di Sam, attraverso la creazione di un metodo nel mio servizio che ha restituito gli elementi nell'ordine che volevo. Ho appena usato ORMExecuteQuery per ottenere gli articoli nell'ordine corretto, e se non ci fossero articoli, ho appena restituito un array vuoto.

L'ultimo metodo si presentava così, in cui specifiche sono impostate direttamente in oggetto nell'ordine li voglio:

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