必须显式指定Oracle12cDialect,否则Hibernate 6可能生成不兼容SQL;需授予应用用户序列SELECT权限;原生SQL末尾禁用分号;必须使用ojdbc8.jar或更高版本驱动。
Hibernate 生成的 Oracle SQL 无法执行,绝大多数情况不是“SQL 写错了”,而是 Hibernate 没有被正确告知“你正在跟 Oracle 12c 打交道”——它默认按通用规则或旧版逻辑生成语句,结果在 Oracle 12c 上直接报 ORA-00911、ORA-00942 或 SQLGrammarException。
Hibernate 6 不再自动推断 Oracle 版本。不指定方言时,它可能 fallback 到 OracleDialect(已废弃)或 Oracle10gDialect,导致生成不兼容语法:
rownum 做分页但没加双引号包裹别名,Oracle 12c 报错IDENTITY 列生成 SELECT ... NEXTVAL 时漏掉 schema 限定SYSDATE 当作无精度时间处理,而 12c 默认带纳秒精度JSON 关键字实操建议:
application.properties 中写死:spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
<property name="hibernate.dialect">org.hibernate.dialect.Oracle12cDialect</property>
OracleDialect 或 Oracle10gDialect —— 它们连 OFFSET ... FETCH 都不支持这个错误常被误判为“表名写错”,但在 Hibernate 6 + Oracle 12c 场景下,90% 是因为应用用户缺少对序列的 SELECT 权限。Hibernate 主键生成逻辑会执行类似 SELECT MY_SEQ.NEXTVAL FROM DUAL,这不是查表,是查序列 —— 必须单独授权。
SELECT MY_SCHEMA.MY_SEQ.NEXTVAL FROM DUAL; —— 若报 ORA-00942,就是权限问题GRANT SELECT ON MY_SCHEMA.MY_SEQ TO APP_USER;
"MySeq"),授权也必须写成 GRANT SELECT ON MY_SCHEMA."MySeq" TO APP_USER;
SELECT 'GRANT SELECT ON ' || sequence_name || ' TO APP_USER;' FROM all_sequences WHERE sequence_owner = 'MY_SCHEMA';
Hibernate 6 对原生 SQL 解析更严格。在 @Query(nativeQuery = true) 或 createNativeQuery() 中,字符串末尾若带分号(;),JDBC 驱动会直接抛 ORA-00911: 无效字符,且堆栈不指向你的代码行。
"SELECT * FROM users WHERE id = ?;"
"SELECT * FROM users WHERE id = ?"
? 或命名参数(:paramName),严禁字符串拼接,尤其警惕动态 SQL 拼接后漏删分号如果 Oracle 表或字段是用双引号创建的(比如 DBeaver 导出脚本里常见 "NewTable"、"ID"),那么后续所有 SQL 中都必须带双引号,否则 Oracle 认为是不同对象。
@Table(name = ""NewTable"") 和 @Column(name = ""ID"")
" 转义双引号:<class name="User" table=""NewTable"">
最易被忽略的一点:方言配对、驱动版本、权限授予、引号处理,这四件事必须同时到位。只改其中一项,其他三项仍会把问题拖回来 —— 尤其是 ojdbc8.jar 以下版本(比如 ojdbc6)在 12c 上连 NVARCHAR2 长度都会解析错,这种底层驱动问题不会在日志里明说,只会表现为莫名其妙的截断或插入失败。
小米路由器3G怎么恢复出厂设置(小米路由器3G该如何恢复出厂设置)
小米路由器3g和4a千兆版哪个好(小米路由器3g和4a千兆版对比区别)
Sensor Tower:ChatGPT全球份额跌破50%,Gemini与Claude加速追赶
OpenAI提速狂飙16倍!GPT-5.6多智能体V2上线,741轮怪物对话1秒打开
“十五五”时期 煤矿危险繁重岗位将由机器人替代
waytouniverse/ppt-generator:从 Markdown 大纲生成风格统一的 PPT 图片