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

下一篇: Hibernate positional parameters zero based