【问题标题】:CF Hibernate only accepts arrays for IN ( x ) with named parameters, not positional parametersCF Hibernate 只接受带有命名参数的 IN ( x ) 数组,而不接受位置参数
【发布时间】:2014-02-17 13:33:29
【问题描述】:

此示例代码演示了该问题:

var Names = ['Jon','Anna'];

var Params.Pos1   = [ Names[1] ];
var Params.Pos2   = [ Names[1] , Names[2] ];
var Params.Pos3   = [ Names ];
var Params.Named1 = { name:Names[1] };
var Params.Named2 = { name1:Names[1] , name2:Names[2] };
var Params.Named3 = { names:Names };

var BaseHql = "SELECT COUNT(*) FROM Person WHERE ";
var Queries.Pos1   = BaseHql & "FirstName IN (?)";
var Queries.Pos2   = BaseHql & "FirstName IN (?,?)";
var Queries.Pos3   = BaseHql & "FirstName IN (?)";
var Queries.Named1 = BaseHql & "FirstName IN (:name)";
var Queries.Named2 = BaseHql & "FirstName IN (:name1,:name2)";
var Queries.Named3 = BaseHql & "FirstName IN (:names)";

var Results = {};

for ( var Item in Queries )
{
    try
    {
        Results[Item] = OrmExecuteQuery( Queries[Item] , Params[Item] );
    }
    catch (any cfcatch)
    {
        Results[Item] = "[#cfcatch.message#|#cfcatch.detail#]";
    }
}

六个场景中的五个有效。

Queries.Pos3 不起作用,尽管它与 Queries.Named3 完全相同。

它返回此错误消息和详细信息:

复杂对象类型不能转换为简单值。

表达式请求了一个变量或一个中间表达式结果作为一个简单的值。但是,结果不能转换为简单值。简单值是字符串、数字、布尔值和日期/时间值。查询、数组和 COM 对象是复值的示例。

错误的最可能原因是您尝试将复杂值用作简单值。例如,您尝试在 cfif 标记中使用查询变量。

堆栈跟踪是:

coldfusion.runtime.CfJspPage$ComplexObjectException: Complex object types cannot be converted to simple values.
    at coldfusion.runtime.Cast._String(Cast.java:1036)
    at coldfusion.runtime.Cast._cast(Cast.java:192)
    at coldfusion.orm.ORMUtils.getTypedValue(ORMUtils.java:359)
    at coldfusion.orm.hibernate.HibernatePersistenceManager.setQueryParams(HibernatePersistenceManager.java:844)
    at coldfusion.orm.hibernate.HibernatePersistenceManager._executeHQL(HibernatePersistenceManager.java:781)
    at coldfusion.orm.hibernate.HibernatePersistenceManager.executeHQL(HibernatePersistenceManager.java:753)
    at coldfusion.orm.hibernate.HibernatePersistenceManager.executeQuery(HibernatePersistenceManager.java:615)
    at coldfusion.orm.ORMUtils._executeQuery(ORMUtils.java:344)
    at coldfusion.orm.ORMUtils._executeQuery(ORMUtils.java:311)
    at coldfusion.orm.ORMUtils.executeQuery(ORMUtils.java:303)
    at coldfusion.runtime.CFPage.ORMExecuteQuery(CFPage.java:8933)

上面的代码是否有问题,或者这是 CF 或 Hibernate 的错误/限制?

【问题讨论】:

    标签: hibernate coldfusion hql


    【解决方案1】:

    Hibernate 似乎使用setParameterList 将数组设置为单个参数。

    relevant javadoc page 显示 four versions of setParameterList,但它们都只接受命名参数 - 与 setParameter 方法不同,它的版本带有名称或位置参数。

    因此,您不能将数组作为位置参数传递,这似乎是 Hibernate 的任意限制。

    即此代码无法工作:

    OrmExecuteQuery( "FROM Person WHERE FirstName IN (?)" , [ArrayOfNames] );
    

    查询需要切换到命名参数,或者位置参数需要展平(例如,可能使用?#RepeatString(',?',ArrayLen()-1)# 或类似的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-06
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2019-12-23
      相关资源
      最近更新 更多