2010-11-11 3 views
5

Я использую запрос HQL, чтобы получить кучу государственных объектов, как так:Использование cfqueryparam с запросом ColdFusion HQL

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

Это прекрасно работает. Тем не менее, я был воспитан хорошо, и я хочу использовать cfqueryparam, в идеале, как так:

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

Но это выдает ошибку:

[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 .... 

Любой знает, как обойти эту проблему и использовать cfqueryparam с cfquery Запросы HQL?

Заранее благодарен!

ответ

1

Я добрался до основания.

Моего States объект был настройки следующим образом:

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

При использовании <cfqueryparam> тега Hibernate был, возможно, пытается сопоставить число я проходивший в виде массива и неудачу, таким образом, бросая ошибку.

Если удалить отношения со свойством, как так:

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

... тогда это работает.

0

Косвенный ответ: вместо этого используйте связанные параметры.

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

Вам придется по-прежнему сворачивать свою собственную проверку на переменные.

+0

Я действительно ХОЧУ использовать 'cfquery'. Это означает, что я вернулся к ysing 'ORMExecuteQuery()', который не то, что я хочу. –

+0

@ciaran - почему вы хотите использовать cfquery? вы рассматриваете orm как уровень абстракции sql? если это так, вам не хватает какой-либо/большей мощности – Antony

+1

@Antony: Основная причина в том, что мне не нужно делать уродливую конкатенацию строк и писать многострочные операторы, которые читаемы! :) –

2

Снять тип данных, это не требуется, и спящий режим, вероятно, не понимает их.

Смежные вопросы