Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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参数索引超出范围,但I';我不使用编号参数_Java_Hibernate_Jpa_Jpql - Fatal编程技术网

Java Hibernate参数索引超出范围,但I';我不使用编号参数

Java Hibernate参数索引超出范围,但I';我不使用编号参数,java,hibernate,jpa,jpql,Java,Hibernate,Jpa,Jpql,此查询: em.createQuery("SELECT p FROM Player p WHERE p.displayName LIKE :q ESCAPE '\\'", Player.class) .setParameter("q", "%" + query.replace("_", "\\_") + "%") .setMaxResults(20) .getResultList() 导致 java.sql.SQLException: Parameter index out of range

此查询:

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

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).
为什么??在查询中,我没有使用编号参数,只使用名为one(
q
)的参数,据我所见,该参数随后被正确绑定

这是完整的stacktrace

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

通过双重转义反斜杠修复了此问题:

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

但我认为错误消息并不正确。

看起来这是一个hibernate+mysql错误。避免异常的一种更优雅的方法是将转义字符本身作为参数传递到转义部分之后。