多対多と複数の基準のためのCF9 HQL文
-
22-09-2019 - |
質問
私は次のセットアップを持っています:
Listing.cfc
component persistent="true"
{
property name="ListingId" column="ListingId" type="numeric" ormtype="int" fieldtype="id" generator="identity";
...
property name="Features" type="array" hint="Array of features" singularname="Feature" fieldtype="many-to-many" cfc="Feature" linktable="Listing_Feature" FKColumn="ListingId" inversejoincolumn="FeatureId";
}
Feature.cfc
component persistent="true" table="Feature" schema="dbo" output="false"
{
property name="FeatureId" column="FeatureId" type="numeric" ormtype="int" fieldtype="id" generator="identity";
property name="FeatureDescription" column="FeatureDescription" type="string" ormtype="string";
...
/*property name="Listings" fieldtype="many-to-many" cfc="Listing" linktable="Listing_Feature" fkcolumn="FeatureId" inversejoincolumn="ListingId" lazy="true" cascade="all" orderby="GroupOrder";*/
}
私が使用して特定の機能を持っているすべてのリストを選択することができます:
<cfset matchingListings = ormExecuteQuery("from Listing l left join l.Features as feature where feature.FeatureId = :feature",{feature = 110}) />
罰金されており、しかし、私は(例えば、「食器洗い機」AND「ガレージ」の両方を持っているリスト)に複数の機能を持っているすべてのリストを選択できるようにしたいと思います。
グーグルと休止状態のドキュメントを見の数時間は私にエラーを与えることはありません解決策を見つけることができませんでした後。私の推測では、ソリューションは非常に単純であり、私はちょうどそれをオーバー考えています...誰もが何か提案を持っているということですか。
解決
私はこれはこれを行うための最も効率的な方法であることを信じていません、しかし、それは私が
欲しい結果を生成しません<cfset matchingListings = ormExecuteQuery("Select l.ListingId from Listing l
left join l.Features as featureone left join l.Features as featuretwo
left join l.Features as featurethree
where featureone.FeatureId = 108
and featuretwo.FeatureId = 110
and featurethree.FeatureId = 113") />
これは私にすべての私が探していますが、それは休止状態SQLログで参加すると見ているのLOTが生成されない特徴持っている唯一のリストを与えます
select listing0_.ListingId as col_0_0_
from dbo.Listing listing0_
left outer join Listing_Feature features1_ on listing0_.ListingId=features1_.ListingId
left outer join dbo.Feature feature2_ on features1_.FeatureId=feature2_.FeatureId
left outer join Listing_Feature features3_ on listing0_.ListingId=features3_.ListingId
left outer join dbo.Feature feature4_ on features3_.FeatureId=feature4_.FeatureId
left outer join Listing_Feature features5_ on listing0_.ListingId=features5_.ListingId
left outer join dbo.Feature feature6_ on features5_.FeatureId=feature6_.FeatureId
where 1=1
and feature2_.FeatureId=108
and feature4_.FeatureId=110
and feature6_.FeatureId=113
ちょうどHQLでこれを行うには、より効率的な方法が存在しなければならないように思える。
<時間> :CF-ORM-devメーリングリスト上のジョン・メッサーは、私はこの質問みんなのためにそれをここに掲示する最も正しい解決策であると考えているものを私に与えました
「私の知る限り、あなたがそれらをPARAMしたい場合ORMExecuteQueryはそう、リストのパラメータを処理していません知っているとリターンはあなたのような何かをしなければならないと思いオブジェクトとして
<cfset featureIds = [javaCast('int',108), javaCast('int',110), javaCast('int',113)] >
<cfset q = ormGetSession().createQuery("
select l.ListingId
from Listing l
join l.features as f
where f.FeatureId in (:features)
group by l.ListingId
having count(*) = #arrayLen(featureIds)#
") />
<cfset q.setParameterList('features', featureIds) />
<cfset matchingListings = q.list() />
"
おかげジョン!
他のヒント
これは動作するはずます:
<cfset featurelist = "110,113,125"/>
<cfset matchingListings = ormExecuteQuery("from Listing l left join l.Features as feature where feature.FeatureId IN (#featurelist#)")/>
あなたがバインドされたパラメータと一緒に行きたい場合は、Hibernateはこの時点バウンドパラメータとしてColdFusionリストおよび/または配列好きではないので、あなたは、いくつかの余分な作業を行う必要があります。あなたはここを<いくつかの余分な情報を見つけることができます/ P>
所属していません StackOverflow