2012-01-05 8 views
1

にこのクエリを使用していないよ:範囲の外にHibernateパラメータインデックスが、私は番号のパラメータ

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1). 

なぜで

em.createQuery("SELECT p FROM Player p WHERE p.displayName LIKE :q ESCAPE '\\'", Player.class) 
.setParameter("q", "%" + query.replace("_", "\\_") + "%") 
.setMaxResults(20) 
.getResultList() 

結果?私はクエリで番号の付いたパラメータを使用していません。私が見る限り、正確にバインドされているもの(q)です。

完全性のためにここに完全なスタックトレースがあります。

二重バックスラッシュをエスケープすることにより、それを修正
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1215) ~[hibernate-entitymanager-jar-hibernate-entitymanager-3.6.6.Final.jar:3.6.6.Final] 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1148) ~[hibernate-entitymanager-jar-hibernate-entitymanager-3.6.6.Final.jar:3.6.6.Final] 
     at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255) ~[hibernate-entitymanager-jar-hibernate-entitymanager-3.6.6.Final.jar:3.6.6.Final] 
     at tr.example.data.DataServer$RemoteDataServerImpl.searchPlayer(DataServer.java:922) ~[dataserver.jar:na] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0] 
     at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
     at tr.example.data.DataServer$1.invoke(DataServer.java:169) ~[dataserver.jar:na] 
     at $Proxy4.searchPlayer(Unknown Source) [na:na] 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0] 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0] 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0] 
     at java.lang.reflect.Method.invoke(Method.java:601) ~[na:1.7.0] 
     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) [na:1.7.0] 
     at sun.rmi.transport.Transport$1.run(Transport.java:177) [na:1.7.0] 
      at sun.rmi.transport.Transport$1.run(Transport.java:174) [na:1.7.0] 
     at java.security.AccessController.doPrivileged(Native Method) [na:1.7.0] 
     at sun.rmi.transport.Transport.serviceCall(Transport.java:173) [na:1.7.0] 
     at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) [na:1.7.0] 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) [na:1.7.0] 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) [na:1.7.0] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0] 
     at java.lang.Thread.run(Thread.java:722) [na:1.7.0] 
Caused by: org.hibernate.exception.GenericJDBCException: could not execute query 
     at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.doList(Loader.java:2536) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.list(Loader.java:2271) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1268) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246) ~[hibernate-entitymanager-jar-hibernate-entitymanager-3.6.6.Final.jar:3.6.6.Final] 
     ... 22 common frames omitted 
Caused by: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1). 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3709) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3693) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3735) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3679) ~[mysql-connector-java-jar-mysql-connector-java-5.1.14.jar:na] 
     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setInt(NewProxyPreparedStatement.java:677) ~[c3p0-jar-c3p0-0.9.1.jar:0.9.1] 
     at org.hibernate.loader.Loader.bindLimitParameters(Loader.java:1812) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1719) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.doQuery(Loader.java:801) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     at org.hibernate.loader.Loader.doList(Loader.java:2533) ~[hibernate-core-jar-hibernate-core-3.6.7.Final.jar:3.6.7.Final] 
     ... 30 common frames omitted 

答えて

2

em.createQuery("SELECT p FROM Player p WHERE p.displayName LIKE :q ESCAPE '\\\\'", Player.class) 
.setParameter("q", "%" + query.replace("_", "\\\\_") + "%") 
.setMaxResults(20) 
.getResultList() 

しかし、エラーメッセージが本当に適切ではなかった、と思います。

関連する問題