使用cfqueryparam与ColdFusion HQL查询

6

我正在使用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 ....

有人知道如何绕过这个问题并在cfquery HQL查询中使用cfqueryparam吗?

提前感谢!

3个回答

2

去掉数据类型,这不是必须的,而且hibernate可能无法理解它们。


1
间接回答:使用绑定参数。
<cfset orderDetail = ORMExecuteQuery("from Orders where OrderID=:orderid and ProductID=:productid", {orderid=1, productid=901}, true)>

然而,您仍需要自己验证变量。


我实际上想使用 cfquery。这个答案意味着我又回到了使用 ORMExecuteQuery(),而这不是我想要的。 - Ciaran Archer
@ciaran - 你为什么想要使用cfquery?你是将ORM视为SQL抽象层吗?如果是这样,那么你会错过一些/大部分的功能。 - Antony
1
@Antony:主要原因是我不必进行丑陋的字符串拼接,可以编写易读的多行语句! :) - Ciaran Archer
@ciaran - 尝试使用cfsavecontent避免字符串拼接。 - Antony

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

...然后它就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接