我无法使用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)
答案 0 :(得分:2)
我接受了斯坦尼斯拉夫的回答,但为了彻底,我想在我的代码中记录一些错误:
Remember that ordinal parameters are 1-based!
),但位置参数基于0。您可以在文档的示例中看到这一点。参数自动在自身周围放置引号,阻止您将它们用于表,列等的名称。例如,在上面的代码中 - 从查询中删除所有引号后 - ,我的输出查询是:
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();