2010-11-11 15 views
5

ColdFusion HQL J'utilise une requête HQL pour obtenir un tas d'objets d'état comme ceci:En utilisant cfqueryparam avec une requête

<cfquery name="LOCAL.qStates" dbtype="hql"> 
    from States where countryID = #ARGUMENTS.countryID# 
    order by name asc 
</cfquery> 

Cela fonctionne très bien. Cependant, j'ai été élevé bien et je veux utiliser cfqueryparam, idéalement comme ceci:

<cfquery name="LOCAL.qStates" dbtype="hql"> 
    from States 
    where countryID = <cfqueryparam cfsqltype="cf_sql_integer" value="#ARGUMENTS.countryID#" /> 
    order by name asc 
</cfquery> 

Mais cela jette une erreur:

[empty string] java.lang.NullPointerException at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:353) at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:323) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:98) at coldfusion.orm.hibernate.HibernatePersistenceManager._executeHQL(HibernatePersistenceManager.java:822) at coldfusion.orm.hibernate.HibernatePersistenceManager.executeHQL(HibernatePersistenceManager.java:751) at .... 

Quelqu'un sait comment contourner ce problème et utiliser cfqueryparam avec cfquery Requêtes HQL?

Merci d'avance!

Répondre

1

Je suis allé au fond de ceci.

Mon objet States a été installé comme ceci:

<cfcomponent output="false" persistent="true"> 

     <cfproperty name="stateID" type="numeric" fieldType="id" generator="identity" /> 
     <cfproperty name="name" type="string" /> 
     <cfproperty name="alphaCode" type="string" /> 


     <!--- Relationships ---> 
     <cfproperty name="country" type="array" fieldtype="many-to-one" cfc="Countries" fkcolumn="countryID" lazy="true" /> 



    </cfcomponent> 

Lorsque vous utilisez la mise en veille prolongée tag <cfqueryparam> était peut-être essayer de cartographier le numéro que je passais comme un tableau et de ne pas jeter ainsi une erreur.

Si je supprime la relation de la propriété comme ceci:

<cfproperty name="countryID" type="numeric" /> 

... alors cela fonctionne.

0

Réponse indirecte: utilisez des paramètres liés à la place.

<cfset orderDetail = ORMExecuteQuery("from Orders where OrderID=:orderid and ProductID=:productid", {orderid=1, productid=901}, true)> 

Cependant, vous devrez toujours lancer votre propre validation sur les variables.

+0

Je veux en fait utiliser 'cfquery'. Cette réponse signifie que je suis de retour à ysing 'ORMExecuteQuery()' ce qui n'est pas ce que je veux. –

+0

@ciaran - pourquoi voulez-vous utiliser cfquery? Traitez-vous orm comme une couche d'abstraction sql? si c'est le cas, vous manquez une partie/la majeure partie de la puissance – Antony

+1

@Antony: La raison principale est que je n'ai pas à faire de concaténation de chaînes moche et que je peux écrire des instructions multi-lignes lisibles! :) –

2

Enlever le type de données, ce n'est pas obligatoire et Hibernate ne les comprend probablement pas.