我正在为我的 Entity/Pojo 类中的一个属性使用 @Formula
注释。在运行时,它正在创建一个查询来获取结果并抛出错误 ORA-02000: missing WITHIN keyword
因为它无法将 WITHIN
识别为关键字。
Marks.java
@Formula("(SELECT CASE WHEN dis_order IS NULL THEN (SELECT listagg(qpm.displayed_order,', ') WITHIN GROUP (ORDER BY qpm.displayed_order) FROM que_post_mark qpm WHERE qpm.es_id = es_id AND qpm.sez_id = sez_id GROUP BY qpm.es_id, qpm.sez_id) ELSE NULL END FROM dual)")
private String childItemsDisplayedOrder;
生成的查询如下:
select marks0_.*,
(SELECT
CASE
WHEN marks0_.displayed_order IS NULL THEN (SELECT
listagg(qpm.displayed_order,
', ') marks0_.WITHIN
GROUP (ORDER BY
qpm.displayed_order)
FROM
que_post_mark qpm
WHERE
qpm.es_id = marks0_.es_id
AND qpm.sez_id = marks0_.sez_id
GROUP BY
qpm.es_id ,
qpm.sez_id)
ELSE NULL
END
FROM
dual) as formula2_0_
from
MARKS marks0_
where
marks0_.es_id =?
它将 WITHIN
标识为列并附加别名,例如 marks0_.WITHIN
我正在使用以下版本:
spring-boot-starter-web = 1.4.0.RELEASE, spring-data-jpa:jar:1.10.2 ,hibernate-entitymanager:jar:5.1.3' hibernate-core:jar:5.1.3, hibernate-jpa-2.1-api:jar
我试图降低那些 jar 版本以使其工作,但它没有工作。
错误堆栈跟踪如下:
Caused by: java.sql.SQLSyntaxErrorException: ORA-02000: missing WITHIN keyword
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:53)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:774)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:4798)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4845)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1501)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
... 136 common frames omitted
谁能帮我解决这个问题?
最佳答案
我已经通过扩展 hibernate Dialect 类解决了这个问题,如 this link 中所述
public class Oracle10gDialectExtended extends Oracle10gDialect {
public Oracle10gDialectExtended() {
super();
registerKeyword("within"); //Keyword has to be in lowercase.
}
}
用这个新类设置“hibernate.dialect”属性。
Properties.setProperty("hibernate.dialect", "com.example.Oracle10gDialectExtended");
关于java - Hibernate/Spring Data JPA 无法在 Spring Boot 应用程序中识别 WITHIN 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421138/