Frage

Ich habe folgendes Setup:

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";*/

} 

Ich kann Alle Anzeigen auswählen, die eine bestimmte Funktion hat mit:

<cfset matchingListings = ormExecuteQuery("from Listing l left join l.Features as feature where feature.FeatureId = :feature",{feature = 110}) />

was in Ordnung ist, aber, würde Ich mag können Alle Anzeigen auszuwählen, die mehrere Funktionen haben (zum Beispiel einer Auflistung, dass sowohl „Spülmaschine“ AND „Garage“)

Nach ein paar Stunden googeln und suche durch Hibernate Dokumentation nicht in der Lage, eine Lösung zu finden, die mir keinen Fehler geben. Meine Vermutung ist, dass die Lösung ist ziemlich einfach und ich bin einfach über dachte, es ... jemand irgendwelche Vorschläge?

War es hilfreich?

Lösung

Ich glaube nicht, dies der effizienteste Weg, dies zu tun, aber es tut produziert das Ergebnis, das ich will

<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") />

Das gibt mir nur Angebote, die alle Features Ich habe mich suchen, aber es hat eine Menge von Verbindungs- und Blick auf die Hibernate SQL Log produziert:

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

Es scheint, wie es muss ein effizienter Weg, dies in HQL zu tun


Jon Messer auf der cf-ORM-dev Mailingliste gab mir, was ich glaube, ist die richtige Lösung für diese Frage hier für alle Buchung:

"Soweit ich weiß, ORMExecuteQuery nicht Liste Parameter nicht handhaben, so dass, wenn Sie sie param wollen und zurück Objekte, die Sie etwas zu tun haben würden wie

<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() />

"

Danke Jon!

Andere Tipps

Dies sollte funktionieren:

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

Wenn Sie mit gebundenen Parametern gehen wollen Sie einige zusätzliche Arbeit zu tun haben, weil Hibernate nicht wie Coldfusion-Listen funktioniert und / oder Arrays als gebundener Parameter dieser Zeit. Sie können einige zusätzliche Informationen finden hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top