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
在order子句中使用查询参数时出现Java Hibernate错误_Java_Hibernate_Jpa_Parameters_Sql Order By - Fatal编程技术网

在order子句中使用查询参数时出现Java Hibernate错误

在order子句中使用查询参数时出现Java Hibernate错误,java,hibernate,jpa,parameters,sql-order-by,Java,Hibernate,Jpa,Parameters,Sql Order By,当使用ORDER BY子句中的查询参数以及与fetch策略子选择的oneToMany关系时,Hibernate 5.0.10抛出异常:java.sql.SQLException:Invalid column index 问题在于:Hibernate完美地执行了查询。但是之后,当加载被引用的oneToMany关系时,它会重用部分查询(尤其是WHERE子句)来加载所有被引用的实体。查询的某些部分,如ORDERBY子句将被剥离。不幸的是,原始查询中的所有查询参数都是按原样进入子选择查询的,而没有检查它

当使用ORDER BY子句中的查询参数以及与fetch策略子选择的oneToMany关系时,Hibernate 5.0.10抛出异常:
java.sql.SQLException:Invalid column index

问题在于:Hibernate完美地执行了查询。但是之后,当加载被引用的oneToMany关系时,它会重用部分查询(尤其是WHERE子句)来加载所有被引用的实体。查询的某些部分,如ORDERBY子句将被剥离。不幸的是,原始查询中的所有查询参数都是按原样进入子选择查询的,而没有检查它们是否仍然是必需的。当Hibernate执行subselect查询时,它绑定的参数比导致异常的查询中的参数多

10:01:23,749 DEBUG [org.hibernate.SQL] (default task-22) select person0_.ID as ID1_1_, person0_.NAME as NAME2_1_ from APERSON person0_ order by ?||person0_.NAME
10:01:23,756 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,766 DEBUG [org.hibernate.SQL] (default task-22) select address0_.PERSON as PERSON3_0_1_, address0_.ID as ID1_0_1_, address0_.ID as ID1_0_0_, address0_.NAME as NAME2_0_0_ from AADDRESS address0_ where address0_.PERSON in (select person0_.ID from APERSON person0_ )
10:01:23,770 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,775 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) SQL Error: 17003, SQLState: 99999
10:01:23,775 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) Invalid column index
这是一个bug还是JPA不支持它

编辑-添加来自JPA规范的报价 输入参数只能在查询的WHERE子句或HAVING子句中使用,或作为新参数使用 update语句的SET子句中update项的值

但无论如何,这将是一个很好的Hibernate特性。此外,CriteriaAPI将所有文本绑定为参数。因此,无法使用CriteriaAPI在select/groupBy/orderBy子句中使用文本。JPA是否也这样规定

我已设置了一个场景来复制此问题:

SQL HBM映射 编辑插入的日志语句 您可以看到,第一个查询执行得很好,但第二个查询会导致异常

10:01:23,749 DEBUG [org.hibernate.SQL] (default task-22) select person0_.ID as ID1_1_, person0_.NAME as NAME2_1_ from APERSON person0_ order by ?||person0_.NAME
10:01:23,756 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,766 DEBUG [org.hibernate.SQL] (default task-22) select address0_.PERSON as PERSON3_0_1_, address0_.ID as ID1_0_1_, address0_.ID as ID1_0_0_, address0_.NAME as NAME2_0_0_ from AADDRESS address0_ where address0_.PERSON in (select person0_.ID from APERSON person0_ )
10:01:23,770 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,775 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) SQL Error: 17003, SQLState: 99999
10:01:23,775 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) Invalid column index

在设置参数之后和调用
getResultSet
之前打印查询,您可以轻松调试。可能您的数据库系统不支持concat方法?不,这不是问题所在。我已经将日志附在您可以看到的地方,您可以看到concat函数是受支持的,并且工作正常。问题是第二个查询,在获取address.JPA规范的相关实体时,ORDER BY子句中不允许使用参数。一些JPA提供商允许它(例如DataNucleus,因为我使用它),但不知道Hibernate@NeilStockton:谢谢,你说得对。也许这就是Hibernate不支持它的原因。我添加了来自JPA规范的引用。
em.createQuery("SELECT p FROM Person p ORDER BY concat(:prefix, p.name)")
.setParameter("prefix", "any")
.getResultList(); //Exception here
10:01:23,749 DEBUG [org.hibernate.SQL] (default task-22) select person0_.ID as ID1_1_, person0_.NAME as NAME2_1_ from APERSON person0_ order by ?||person0_.NAME
10:01:23,756 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,766 DEBUG [org.hibernate.SQL] (default task-22) select address0_.PERSON as PERSON3_0_1_, address0_.ID as ID1_0_1_, address0_.ID as ID1_0_0_, address0_.NAME as NAME2_0_0_ from AADDRESS address0_ where address0_.PERSON in (select person0_.ID from APERSON person0_ )
10:01:23,770 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] (default task-22) binding parameter [1] as [VARCHAR] - [any]
10:01:23,775 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) SQL Error: 17003, SQLState: 99999
10:01:23,775 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-22) Invalid column index