Я не считаю, что это самый эффективный способ сделать это, однако, он дает желаемый результат
<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 не обрабатывает параметры списка, поэтому, если вы хотите задать их параметры и вернуть объекты, вам придется сделать что-то вроде
<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() />
"
Спасибо, Джон!