Использование cfqueryparam с HQL-запросом ColdFusion - PullRequest
6 голосов
/ 11 ноября 2010

Я использую 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-запросами?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 12 ноября 2010

Снимите Datatype, он не требуется, и, вероятно, hibernate их не понимает.

1 голос
/ 15 ноября 2010

Я докопался до этого.

Мой 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" />

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

1 голос
/ 11 ноября 2010

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

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

Вам все равно придется проверять переменные самостоятельно.

...