Hibernate 5.X迁6.X自定义方言下JPA复合键保存SQL语法报错
解决Hibernate 6针对Actian Pervasive SQL复合键查询语法问题
方法1:自定义方言禁用行值表达式支持
Hibernate 6默认通过行值表达式(即(列1,列2) in ((?,?))语法)处理复合键的存在性检查,但Actian Pervasive SQL不支持该语法。你需要在自定义的Pervasive方言类中覆盖相关方法,强制Hibernate生成传统的多列AND连接查询:
public class CustomPervasiveDialect extends PervasiveDialect { // 替换为你的基础方言类 @Override public boolean supportsRowValueConstructorSyntaxInInList() { return false; } }
然后在Spring Boot配置文件中指定该自定义方言:
spring.jpa.properties.hibernate.dialect=com.your.package.CustomPervasiveDialect
方法2:全局配置禁用行值IN语法
如果自定义方言的方式不生效,可以直接通过Hibernate配置参数全局强制使用传统查询语法:
spring.jpa.properties.hibernate.query.force_non_row_value_in_list=true
验证修改
重启应用后执行saveAndFlush操作,生成的SQL应恢复为Hibernate 5时期的格式:select historylin0_.DocumentNumber from HistoryLines historylin0_ where historylin0_.DocumentNumber=? and historylin0_.ItemCode=?
内容的提问来源于stack exchange,提问作者user22651384
相关产品推荐
相关产品推荐

