Pregunta

Tengo tres tablas, con la siguiente estructura:

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

Los tres objetos que trato están aquí:

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

Tengo que ser capaz de obtener un PartObject y, a continuación, tire todos sus atributos, ordenadas según el AttributeName en la tabla Tipos. Estos son los problemas que estoy corriendo en:

  1. No puedo ordenar los atributos de la propiedad en PartObject por su Attribute.AttributeName propiedad

  2. No puedo añadir la propiedad a la entidad Attribute.AttributeName ObjectAttribute porque me sale un error con respecto a los nombres de columna. 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 consulta mal

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 que no se puede ordenar por esa columna calculada. Si a continuación, ajuste PartObject.cfc este modo:

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

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

Aquí hay un vertedero sin que la propiedad para demostrar que el resto de las relaciones funcionan correctamente:

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

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

Gracias,

Dan

¿Fue útil?

Solución

Me resuelto é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 utilizar ORMExecuteQuery obtener los elementos en el orden correcto, y si no había artículos, acaba de regresar de 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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top