سؤال

لدي الإعداد التالي:

قائمة

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";    
} 

ميزة. 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}) />

ومع ذلك ، فهذا جيد ، أود أن أكون قادرًا على اختيار جميع القوائم التي لها ميزات متعددة (على سبيل المثال قائمة تحتوي على "غسالة صحون" و "جراج")

بعد بضع ساعات من googling والنظر في وثائق السبات لم يتمكن من العثور على حل لن يعطيني خطأ. أظن أن الحل بسيط للغاية وأنا فقط أفكر فيه ... أي شخص لديه أي اقتراحات؟

هل كانت مفيدة؟

المحلول

لا أعتقد أن هذا هو الطريقة الأكثر فعالية للقيام بذلك ، ومع ذلك ، فإنه ينتج النتيجة التي أريدها

<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 Hibernate:

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


أعطاني Jon Messer في قائمة البريد CF-Imm-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() />

"

شكرا جون!

نصائح أخرى

هذا يجب أن يعمل:

<cfset featurelist = "110,113,125"/>
<cfset matchingListings = ormExecuteQuery("from Listing l left join l.Features as feature where feature.FeatureId IN (#featurelist#)")/>

إذا كنت ترغب في الذهاب مع معلمات ملزمة ، فسيتعين عليك القيام ببعض الأعمال الإضافية ، لأن السبات لا يحب قوائم Coldfusion و/أو المصفوفات كمعلمات ملزمة هذه المرة. يمكنك العثور على بعض المعلومات الإضافية هنا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top