我有三个表,结构如下:
http://dl.dropbox.com/u/2586403/ORMIssues/TableLayout.png
我正在处理的三个对象在这里:
http://dl.dropbox.com/u/2586403/ORMIssues/Objects.zip
我需要能够获取PartObject,然后提取其所有属性,并按Types表中的AttributeName进行排序。这是我遇到的问题:
我无法按PartObject的Attribute.AttributeName属性对Attributes属性进行排序
我无法将Attribute.AttributeName属性添加到ObjectAttribute实体,因为出现关于列名的错误。Hibernate将ID放在连接的错误一侧
这是显示错误查询的hibernate日志文件
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.
这是查询中令人讨厌的部分:
from ObjectAttributes objectattr0_ inner join Attributes objectattr0_1_ on objectattr0_.ID=objectattr0_1_.AttributeID
它应该是:
from ObjectAttributes objectattr0_ inner join Attributes objectattr0_1_ on objectattr0_.AttributeID=objectattr0_1_.ID
ObjectAttribute.cfc上的AttributeName属性是导致问题的一个:
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" ; }
我也尝试过使用公式来获取ObjectAttribute实体上的AttributeName,如下所示:
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)"; }
这行得通,但我无法按该计算列排序。如果然后我像这样调整PartObject.cfc:
property name="Attributes" cfc="ObjectAttribute" type="array" fkcolumn="ObjectID" fieldtype="one-to-many" orderby="AttributeName";
我在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.
这是一个 没有 该属性的转储,以显示其余关系正常运行:
http://dl.dropbox.com/u/2586403/ORMIssues/Dump.pdf
我不知道如何解决此问题。您能提供的任何帮助将不胜感激。
谢谢,
担
我在Sam的帮助下解决了这一问题,方法是在Service中设置一种方法,该方法以所需顺序返回商品。我只是使用ORMExecuteQuery以正确的顺序获取项目,如果没有项目,则返回一个空数组。
最终方法如下所示,其中规范按照我想要的顺序直接在对象中设置:
/** @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; } }