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

Java Hibernate-无法在SQLQuery上设置命名参数,java,hibernate,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

我无法使用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();
我收到一个
非法argumentexception
;以下是跟踪的顶部:

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)

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

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

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

我接受了Stanislav的回答,但为了彻底起见,我想记录代码中的一些错误:

  • 尽管有(我使用的是Hibernate 4.1),原生SQL查询似乎不支持命名参数。至少,我无法让他们使用上述代码
  • 尽管有错误日志(
    记住顺序参数是基于1的!
    ),位置参数是基于0的。您可以在文档的示例中看到这一点
  • 参数会自动在其周围放置引号,防止您将其用于表、列等的名称。例如,在我的上述代码中,在从查询中删除所有引号后,我的输出查询是:

    从'my_table'中选择*,其中'my_column'='my_value'

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


  • 可能重复尝试删除
    '
    中的
    '
    ?“
    尝试过;新错误:
    位置超出了已声明顺序参数的数量。请记住,序数参数是基于1的!位置:4
    错误日志明确说明参数是基于1的。。。我遗漏了什么?嗯,可能是您必须尝试手动分配索引,比如1、2