Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate和Postgres位置参数不匹配_Java_Spring_Postgresql_Hibernate - Fatal编程技术网

Java Hibernate和Postgres位置参数不匹配

Java Hibernate和Postgres位置参数不匹配,java,spring,postgresql,hibernate,Java,Spring,Postgresql,Hibernate,我目前正在维护一个使用一些旧技术的遗留应用程序:Hibernate3.2、Spring2.5等等 过去几天我一直在和一个例外抗争。我成功地找到了一个简单的例子: private void test(String username) { String sql = "from org.ojade.aas.authentication.model.User u " + "where u.aasPrincipalName = ?"; Session se

我目前正在维护一个使用一些旧技术的遗留应用程序:Hibernate3.2、Spring2.5等等

过去几天我一直在和一个例外抗争。我成功地找到了一个简单的例子:

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()
时,执行此代码会引发异常

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
没有参数2。如果我将查询更改为使用命名参数,它会工作,但无法更改原始代码(是编译库的一部分)

我已经设置了Hibernate来显示SQL。它正在执行以下任务:

SELECT
    user0_.ID_PRINCIPAL AS ID1_3_,
    user0_.VERSION      AS VERSION3_,
    user0_.NO_PRINCIPAL AS NO4_3_,
    user0_.IN_BLOQUEO   AS IN5_3_,
    user0_.IN_ACTIVO    AS IN6_3_
FROM JAAS_PRINCIPAL user0_
WHERE user0_.TT_DISCRIMINANTE = 'USER' AND user0_.NO_PRINCIPAL =?
看起来还可以

知道问题是什么吗?

根据
postgresql-8.1-405.jdbc3.jar
驱动程序报告,如果查询中有
/**/
注释,包括
,解析器不会理解它不是占位符,而是注释的一部分。显然,美元符号等其他字符也造成了问题

正如原始错误报告中所给出的,这可以通过命名参数、修复注释(在本例中,注释是由Hibernate生成的,因此使用属性
Hibernate关闭Hibernate注释。使用\u sql\u comments=false
修复它)或升级驱动程序以更优雅地处理它来解决(但不知道是哪个版本修复的)


2017年遇到这件事真是一件难事!:)

看起来这可能与此有关,尽管我不太确定是什么原因造成的。提供的解决方案是“删除唯一约束”,但我怀疑这是一个可行的通用替代方案。您使用的是哪个驱动程序版本?这似乎与使用旧的8.0-312.jdbc3驱动程序非常相关。我试图升级它,但新的驱动程序破坏了应用程序。你的链接很有用,谢谢。我已经激活了评论!很有希望,在Kayaman的时候就搞定了。禁用注释(hibernate.use_sql_comments)可以修复此问题。如果您想了解一些要点,请随时写下答案。:-)