Hibernate和Postgres位置参数不匹配

时间:2017-10-26 09:39:56

标签: java spring postgresql hibernate

我目前正在维护使用一些旧技术的遗留应用程序:Hibernate 3.2,Spring 2.5等。

我在最后几天一直在与一个例外战斗。我设法隔离了一个简单的例子:

folder1

执行private void test(String username) { String sql = "from org.ojade.aas.authentication.model.User u " + "where u.aasPrincipalName = ?"; Session session = sessionFactory.getCurrentSession(); QueryImpl query = (QueryImpl) session.createQuery(sql); query.setParameter(0, username); List list = query.list(); log.debug("list = {}", list); } 时,执行此代码会引发异常。

query.list()

没有参数2.如果我更改查询以使用命名参数,它可以工作,但我无法更改原始代码(是已编译库的一部分)。

我已经设置了Hibernate来向我展示SQL。它正在执行:

Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:102)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:166)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:389)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:330)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:240)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:187)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1791)
    at org.hibernate.loader.Loader.doQuery(Loader.java:674)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
    at org.hibernate.loader.Loader.doList(Loader.java:2217)
    ... 120 more

这似乎没问题。

知道问题可能是什么?

1 个答案:

答案 0 :(得分:1)

针对postgresql-8.1-405.jdbc3.jar驱动程序报告的

This old bug通知如果您在查询中包含/* */?条评论,解析器将无法理解它不是占位符,但只是评论的一部分。显然,其他人物如美元符号也会引发问题。

正如原始错误报告中所述,这可以通过命名参数解决,修复注释(在这种情况下注释是由Hibernate生成的,因此关闭Hibernate注释,使用属性hibernate.use_sql_comments=false修复它)或者通过升级驱动程序更优雅地处理它(不知道它修复了哪个版本)。

2017年相当不错! :)