Java Hibernate在使用查询参数时遇到BUG子句
当使用查询参数时,ORDER BY子句与fetch策略子查询中的oneToMany关系结合使用,Hibernate 5.0.10将引发异常: java.sql.SQLException: Invalid column index
问题:Hibernate完美地执行查询。 但之后,在加载引用的oneToMany关系时,它会重用部分查询(特别是WHERE子句)来加载所有引用的实体。 查询的一些部分,如ORDER BY子句将被剥离。 不幸的是,原始查询中的所有查询参数都是在进入子查询查询时进行的,而不检查它们是否仍然是必需的。 当Hibernate执行子查询查询时,它会绑定更多的参数,而不是导致异常的查询。
这是一个错误还是在JPA中不受支持?
编辑 - 从JPA规范中添加引用
输入参数只能在查询的WHERE子句或HAVING子句中使用,或者在更新语句的SET子句中用作更新项的新值。
但无论如何,这将是一个很好的Hibernate功能。 此外,标准API将所有文字作为参数进行绑定。 因此,不可能使用criteria API在select / groupBy / orderBy子句中使用文字。 这也是由JPA指定的吗?
我已经设置了一个复制此问题的场景:
SQL
CREATE TABLE "APERSON"
(
"ID" VARCHAR2(50) PRIMARY KEY NOT NULL,
"NAME" VARCHAR2(255)
);
CREATE TABLE "AADDRESS"
(
"ID" VARCHAR2(50) PRIMARY KEY NOT NULL,
"PERSON" VARCHAR2(50) NOT NULL, -- foreign key
"NAME" VARCHAR2(255)
);
INSERT INTO "APERSON" (ID, NAME) VALUES ('1', 'me');
INSERT INTO "APERSON" (ID, NAME) VALUES ('2', 'you');
HBM映射
<class entity-name="Person" table="APERSON">
<id name="id" column="ID" type="string" />
<property name="name" column="NAME" type="string" />
<bag name="address" fetch="subselect" lazy="false" inverse="true">
<key column="PERSON" />
<one-to-many entity-name="Address" />
</bag>
</class>
<class entity-name="Address" table="AADDRESS">
<id name="id" column="ID" type="string" />
<property name="name" column="NAME" type="string" />
</class>
Java的
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
链接地址: http://www.djcxy.com/p/63827.html
上一篇: Java Hibernate BUG when using query parameters in order clause