【问题标题】:Hibernate - Cannot set named parameter on SQLQueryHibernate - 无法在 SQLQuery 上设置命名参数
【发布时间】:2016-01-04 20:32:46
【问题描述】:

我无法在使用 Hibernate 的本机 SQL 查询上设置参数;这是代码:

Session sess = HibernateUtil.getCurrentSession();
SQLQuery query = sess.createSQLQuery("SELECT * FROM :table WHERE :field = ':value'");       
query
    .addEntity(klass)
    .setString("table", table)
    .setString("field", field)
    .setString("value", value)
    .uniqueResult();

我收到了IllegalArgumentException;这是跟踪的顶部:

java.lang.IllegalArgumentException: Parameter value does not exist as a named parameter in [SELECT * FROM :table WHERE :field = ':value']
    at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:409)
    at org.hibernate.internal.AbstractQueryImpl.setString(AbstractQueryImpl.java:696)

编辑:

尝试使用位置参数,还是报错:

    SQLQuery query = sess.createSQLQuery("SELECT * FROM ? WHERE ? = '?'");

    query
        .addEntity(klass)
        .setParameter(1, table)
        .setParameter(2, field)
        .setParameter(3, value)
        .uniqueResult();

错误:

org.hibernate.QueryParameterException: Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 3
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:80)
at org.hibernate.engine.query.spi.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:86)

【问题讨论】:

标签: java hibernate


【解决方案1】:

我已经接受了 Stanislav 的回答,但为了完整起见,我想在我的代码中记录一些错误:

  1. 尽管有documentation(我使用的是Hibernate 4.1),本机SQL 查询似乎不支持命名参数。至少,我无法让他们使用上面的代码。
  2. 尽管有错误日志 (Remember that ordinal parameters are 1-based!),但位置参数基于 0。您可以在文档的示例中看到这一点。
  3. 参数自动将引号括起来,防止您将它们用于表、列等的名称。例如,在我上面的代码中——从查询中删除所有引号后——我的输出查询是:

    SELECT * FROM 'my_table' WHERE 'my_column' = 'my_value';

    这导致了 SQL 错误。我不得不求助于字符串格式和参数设置的组合。

【讨论】:

    【解决方案2】:

    尝试更改参数编号,第一个需要为0,而不是1:

    SQLQuery query = sess.createSQLQuery("SELECT * FROM ? WHERE ? = '?'");
    
    query
        .addEntity(klass)
        .setParameter(0, table)
        .setParameter(1, field)
        .setParameter(2, value)
        .uniqueResult();
    

    【讨论】:

    • 错误日志明确指出参数是基于 1 的......我错过了什么?
    • hm,您可能需要尝试手动分配索引,例如 ?1、?2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2023-02-20
    • 1970-01-01
    • 2013-08-19
    • 2014-11-09
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多