Coldfusion FW1 (Hibernate) Unión básica entre tablas - "¡Ruta esperada para unirse!"
-
27-10-2019 - |
Pregunta
Estoy tratando de hacer una unión básica que tomaría unos segundos en SQL, pero ... estoy tratando de que funcione con OrmexecuteQuery (Coldfusion 9 basado en Hibernate).
Tengo 3 objetos: - Contact - ContactCategory_Link - ContactCategory
Los detalles de los componentes seguirán después de la breve descripción de lo que funciona y lo que no funciona.
Básicamente, un contacto puede tener muchas categorías, y una categoría también puede tener muchos contactos. Dado que necesito agregar diferentes parámetros para cada enlace (por ejemplo, me gustaría pedir las categorías para cada contacto (los usuarios finales deben poder reordenar las categorías), además de otra información requerida por mi sistema). No utilicé la relación de muchos a muchos porque no parece ser posible agregar ese tipo de información adicional.
Así que aquí está la solicitud que funciona perfectamente:
<cfset response["rows"] = ORMExecuteQuery("
SELECT new map(c.name as Name)
FROM Contact c
")>
Da perfectamente el nombre de contacto. Sin embargo, cada vez que intento agregar otra tabla, fallará. Por ejemplo:
<cfset response["rows"] = ORMExecuteQuery("
SELECT new map(c.name as Name)
FROM Contact c
JOIN ContactCategory_Link
")>
Daré:
Path expected for join!
Incluso si estoy cambiando ContactCategory_Link
por ContactCategory_Link.contact
, dará algo como:
Invalid path: 'null.contact'
Así que supongo que mis componentes CFC no están configurados correctamente, pero no veo por qué.
¿Podrías ayudarme en este tema?
Aquí está el código de cada objeto:
<cfcomponent displayname="Contact" entityname="Contact" table="step8_contact" persistent="true" output="false">
<cfproperty name="id" column="contactID" type="guid" fieldtype="id" setter="false" unique="true" notnull="true" generated="insert" generator="identity">
<cfproperty name="name" column="name" type="string" length="125" required="true">
<cfproperty name="categories" fieldtype="one-to-many" singularname="category" fkcolumn="contactID" cfc="ContactCategory_Link" missingRowIgnored="true" cascade="all-delete-orphan">
</cfcomponent>
<cfcomponent displayname="ContactCategory_Link" entityname="ContactCategory_Link" table="step8_contactcategory_link" persistent="true" output="false">
<cfproperty name="id" column="contactcategory_linkID" type="numeric" fieldtype="id" setter="false" unique="true" notnull="true" generated="insert" generator="identity">
<cfproperty name="orderId" column="orderId" type="numeric" required="true"> <!---notnull="true"--->
<cfproperty name="contact" fieldtype="many-to-one" fkcolumn="contactID" cfc="Contact" missingRowIgnored="true">
<cfproperty name="contactcategory" fieldtype="many-to-one" fkcolumn="contactcategoryID" cfc="ContactCategory" missingRowIgnored="true">
</cfcomponent>
<cfcomponent displayname="ContactCategory" output="false" persistent="true" entityname="ContactCategory" table="step8_contactcategories" hint="" cacheuse="read-only" cachename="contactcategory">
<cfproperty name="id" column="contactcategoryID" type="numeric" fieldtype="id" setter="false" unique="true" notnull="true" generated="insert" generator="identity">
<cfproperty name="label" column="label" type="string" length="255" required="true" notnull="true">
<cfproperty name="orderId" column="orderId" type="numeric" required="true" notnull="true">
<cfproperty name="categories" fieldtype="one-to-many" singularname="category" fkcolumn="contactcategoryID" cfc="ContactCategory_Link" missingRowIgnored="true" cascade="all-delete-orphan" lazy="true">
</cfcomponent>
Gracias por tu ayuda.
Solución
CFSET es probablemente un HQL-Query (lenguaje de consulta Hibernate = lenguaje de consulta de objetos). necesitas
<cfset response["rows"] = ORMExecuteQuery("
SELECT c.name as Name, cat.whatever as Whatever
FROM Contact c
JOIN c.Categories cat
")>