2017-10-26 10 views
1

私は現在、いくつかの古い技術、すなわちHibernate 3.2、Spring 2.5などを使用するレガシーアプリケーションを維持しています。HibernateとPostgresの位置パラメータの不一致

私は例外を除いて最後の日に戦ってきました。 query.list()が実行された場合、このコードの実行が例外をスロー

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); 
} 

:私は簡単な例を隔離するために管理してきました。私はそれが動作という名前のパラメータを使用するクエリを変更した場合

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はありませんが、私は元のコードを(コンパイルされたライブラリの一部である)を変更することはできません。

SQLを表示するようにHibernateを設定しました。これを実行しています:

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ドライバに対して報告

+1

このように見えるかもしれませんが、https://stackoverflow.com/questions/7447922/how-to-cope-with-org-postgresql-util-psqlexception-no-value-specified-for-paraここに何が欠点があるのか​​よく分からない。提供される回避策は「一意制約を削除する」ですが、それは実行可能な一般的な選択肢ではないと考えられます。どのドライバのバージョンを使用していますか? – Kayaman

+1

これはよく関連しているようですhttps://www.postgresql.org/message-id/[email protected] – Kayaman

+0

古いバージョンの8.0-312.jdbc3ドライバを使用しています。私はそれをアップグレードしようとしましたが、新しいドライバは、アプリを壊します。あなたのリンクは役に立ちます、ありがとう。 – sargue

答えて

1

This old bugは、クエリで?含む/* */コメントがあれば、パーサはそれはプレースホルダではないことを理解しますが、コメントの一部に過ぎないことを通知します。明らかにドル記号のような他の文字も問題を引き起こしました。

元のバグレポートに記載されているように、これは名前付きパラメータで解決できます(コメントはHibernateによって生成されたので、プロパティhibernate.use_sql_comments=falseでHibernateコメントを無効にします)。それをより優雅に扱います(どのバージョンが修正されたかは分かりません)。

2017年にこれを見つけよう! :)

関連する問題