Pregunta

Tengo la siguiente configuración:

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

} 

Puedo seleccionar todos los listados que tienen una característica particular usando:

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

Lo que está bien, sin embargo, me gustaría ser capaz de seleccionar todos los listados que tienen varias características (por ejemplo, una lista que tiene tanto "Lavaplatos" Y "Garaje")

Después de un par de horas buscando en Google y mirando a través de la documentación de hibernación no han sido capaces de encontrar una solución que no me dará un error. Mi conjetura es que la solución es bastante simple y sólo estoy pensando demasiado ... Alguien tiene alguna sugerencia?

¿Fue útil?

Solución

No creo que este es el modo más eficaz de hacer esto, sin embargo, lo hace producir el resultado que quiero

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

Esto me dará sólo listas que tienen todas las características Busco pero, que hace un montón de unión y mirar el registro de hibernación SQL está produciendo:

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

Sólo parece que tiene que haber una manera más eficiente de hacer esto en HQL


Jon Messer en la lista de correo cf-ORM-dev me dio lo que yo creo es la solución más correcta a esta pregunta publicar aquí para todo el mundo:

"Por lo que yo sé ORMExecuteQuery no maneja parámetros de la lista, por lo que si se quería param ellos y devolver objetos que tendría que hacer algo como

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

"

Gracias Jon!

Otros consejos

Esto debería funcionar:

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

Si quieres ir con parámetros vinculados tendrá que hacer algún trabajo extra, ya que Hibernate no como listas de ColdFusion y / o matrices como parámetros vinculados en esta ocasión. Usted puede encontrar algo de información adicional aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top