ColdFusion ormを使用したタイプテーブルの列の並べ替え
-
08-10-2019 - |
質問
次の構造を持つ3つのテーブルがあります。
http://dl.dropbox.com/u/2586403/ormissues/tablelayout.png
私が扱っている3つのオブジェクトはここにあります:
http://dl.dropbox.com/u/2586403/ormissues/objects.zip
PartObjectを取得してから、タイプテーブルの属性ネームでソートされたすべての属性を引く必要があります。ここに私が遭遇している問題は次のとおりです。
Partobjectの属性プロパティをその属性によって並べ替えることはできません。
列名に関するエラーが発生しているため、Attribute.AttributENameプロパティをObjectAttribute Entityに追加することはできません。 HibernateはIDを参加の間違った側に置いています
これが悪いクエリを示す冬眠ログファイルです
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の属性プロパティは、問題を引き起こすものです。
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エンティティで属性名を取得してみました。
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
この問題を修正する方法がわかりません。提供できるヘルプは大歓迎です。
ありがとう、
ダン
解決
私は、私が望んでいた順序でアイテムを返したメソッドを私のサービスに設定することにより、サムの助けを借りてこれを解決しました。 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;
}
}