sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1796 随笔 :: 22 文章 :: 24 评论 :: 226万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

spring-data-jpa使用oracle作为数据源时in查询在1000条以上 ,报ORA_01795的错误
原文连接: https://segmentfault.com/a/1190000041913304?sort=votes

目的

解决项目中使用spring-data-jpa,采用oracle 11g作为数据源时,当in查询后面的条件超过1000条后,oracleORA_01795的异常。

思路

问题在于当前版本的oracle不支持单个in查询超过1000的情形,思路是通过jpa提供给我们的有实体类生成SQL后、未执行前的拦截器,对生成的SQL进行判断,如果存在上述的超过1000的情形,将SQL拆分成多个in的组合、通过or连接。
例如:

# jpa转换的SQL通常是如下形式,假如in (?,?,?....)有超过1000个?
select id,name,gender from user where id in(? ,? ,? ,? ,? ,? ,? ,? ,? ,?, ?);
# 将其拆分
select id,name,gender from user where (id in(? ,? ,? ,? ,? ,?) or id in (,? ,? ,?)  or id in(?, ?));

代码

  • 不支持not in,思路其实一样的,not in 需要通过and连接,该场景更少,故不作考虑;
  • 关于性能:

    • 凡是使用了jpadao层操作,均会走到该拦截器,所有基于jpa生成的sql的特征定义一个sql长度的阈值,生成的sqllength如果小于该阈值,直接返回(实际这个基本已经排除了绝大部分的场景);
    • 关于正则匹配,可能有多种写法,由于缺乏对底层的相关机制如:回溯贪心算法等了解,尚有优化的地方(自己试着写了几种不同的形式测了一下,耗时都在1、2ms,所以可能出现的性能瓶颈可能不是sql的转化上,更多的是sql的查询执行上)
posted on   sunny123456  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-03-23 springboot允许跨域注解_SpringBoot项目针对跨域问题的三种解决方案 在Spring Boot 中给我们提供了一个注解 @CrossOrigin 来实现跨域
2022-03-23 C# WebService创建与使用
2022-03-23 Thymeleaf - 使用方法及国际化(超详细) springboot Thymeleaf是一个和Velocity、FreeMarker 类似的模板引擎,它在有网络和无网络的环境下皆可运行
2022-03-23 Udesk微前端之路
2022-03-23 jpa 常用查询方法记录
2022-03-23 mybatis注解多表查询
2022-03-23 Mybatis基于注解实现多表查询
点击右上角即可分享
微信分享提示