2010-10-15 8 views
14

Tengo tres tablas, con la siguiente estructura:clasificación en la columna Tipo de tabla con ColdFusion ORM

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

Los tres objetos que trato son aquí:

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

Necesito poder obtener un PartObject y luego extraer todos sus atributos, ordenados por el AttributeName en la tabla Types. Estos son los problemas que estoy corriendo en:

  1. no puedo ordenar la propiedad Attributes en PartObject por su propiedad Attribute.AttributeName

  2. no puedo añadir la propiedad a Attribute.AttributeName la entidad ObjectAttribute porque recibo un error con respecto a los nombres de las columnas. Hibernate es poner la ID en el lado equivocado de la unión

Aquí está el archivo de registro de hibernación que muestra la mala consulta

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. 

Aquí está la sección infractor de la consulta:

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

debe ser:

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

La propiedad AttributeName en el ObjectAttribute.cfc es el que causa el 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" ; 
} 

También he intentado usar una fórmula para obtener el AttributeName en la entidad ObjectAttribute, así:

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

Esto funciona, pero no puedo ordenar por esa columna calculada. Si a continuación, ajuste PartObject.cfc así:

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

consigo los siguientes errores en el registro de 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. 

Aquí hay un vertedero sin esa propiedad para mostrar que el resto de las relaciones están funcionando correctamente:

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

no tengo ni idea de cómo solucionar este problema. Cualquier ayuda que pueda proporcionar sería muy apreciada.

Gracias,

Dan

+0

En cuanto a 1), ¿por qué no puede usted sólo tiene que utilizar uno de los métodos de clasificación de cflib .org para hacerlo? ¿Qué código está utilizando para concluir que "no se puede ordenar por esa columna calculada"? –

+0

Estoy usando 'property name =" Atributos "cfc =" ObjectAttribute "type =" array "fkcolumn =" ObjectID "fieldtype =" uno-a-muchos "orderby =" AttributeName ";' para intentar y ordenar por el calculado columna. Eso me da el último mensaje de error enumerado arriba. –

+6

¿Ha usado/podría usar ORMExecuteQuery y HQL para obtener más control sobre ORDER BY? –

Respuesta

0

que resuelven éste con ayuda de Sam, mediante la creación de un método en mi servicio que devuelve los elementos en el orden que quería. Acabo de usar ORMExecuteQuery para obtener los elementos en el orden correcto, y si no había elementos, simplemente devolví una matriz vacía.

El último método se veía así, cuando las especificaciones se establecen directamente en el objeto en el orden que les quiero:

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