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}) />
这很好,不过,我希望能够选择具有多种功能的所有目录(例如上市同时具有“厨房”和“车库”)
在谷歌上搜索,并通过Hibernate文档看的几个小时一直没能找到,不会给我一个错误的解决方案。我的猜测是,该解决方案是非常简单的,我只是过于思前想...任何人有什么建议?
解决方案
我不相信这是做到这一点的最有效的方法,但是,它会产生我想
结果<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日志中产生的大量上市:
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邮件列表上给了我什么,我相信是最正确的解决这个问题张贴在这里给大家:
“据我所知ORMExecuteQuery不处理列表参数,所以如果你想PARAM他们返回对象,你不得不这样做。
<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的列表和/或数组作为绑定参数这个时候。你可以找到一些额外的信息这里
不隶属于 StackOverflow