gpt4 book ai didi

java - Hibernate 和 Postgres 位置参数不匹配

转载 作者:行者123 更新时间:2023-11-29 13:17:28 27 4
gpt4 key购买 nike

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

我最近几天一直在与异常(exception)作斗争。我设法分离出一个简单的例子:

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 =?

这看起来不错。

知道问题出在哪里吗?

最佳答案

This old bug针对 postgresql-8.1-405.jdbc3.jar 驱动程序报告,如果您在查询中有 /* */ 注释,包括 ? ,解析器不会理解它不是占位符,而只是注释的一部分。显然其他字符(例如美元符号)也会导致问题。

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

在 2017 年遇到这个问题真是太好了! :)

关于java - Hibernate 和 Postgres 位置参数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46950911/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com