Hibernate - 无法在SQLQuery上设置命名参数

时间:2015-10-07 14:35:58

标签: java hibernate

我无法使用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)

2 个答案:

答案 0 :(得分:2)

我接受了斯坦尼斯拉夫的回答,但为了彻底,我想在我的代码中记录一些错误:

  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错误。我不得不求助于字符串格式和参数设置的组合。

答案 1 :(得分:1)

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

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

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