APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

JOIN 查询同一张表多次,副表数据错乱bug

Open gxmanito opened this issue 1 year ago • 12 comments

Description

APIJSON Version/APIJSON 版本号 6.3.0

Database Type & Version/数据库类型及版本号 mysql8

如图,JOIN 查询同一张表多次,副表数据错乱bug,explain执行计划打印的SQL是对的,但是副表的数据不对

image

gxmanito avatar Nov 27 '24 11:11 gxmanito

断点调试下 AbstractSQLExecutor.execute 中对 JOIN 查到 ResultSet 后分离 主、副 表数据的处理 https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L390-L584

如果这里没问题,也可能是后面对 User:a 生成的缓存 SQL 与对 User:b 生成的缓存 SQL 一致,导致 AbstractSQLExecuto.getCacheItem 取错了

TommyLemon avatar Nov 30 '24 15:11 TommyLemon

也可以先升级到 7.0.3/6.4.3 等更高版本后试试

TommyLemon avatar Nov 30 '24 15:11 TommyLemon

也可以先把驼峰转换去掉后试试还有没有同样问题,看看是不是自己的改动导致

TommyLemon avatar Nov 30 '24 15:11 TommyLemon

也可以先升级到 7.0.3/6.4.3 等更高版本后试试

升级版本暂时不能升级的

gxmanito avatar Dec 02 '24 06:12 gxmanito

也可以先把驼峰转换去掉后试试还有没有同样问题,看看是不是自己的改动导致

驼峰转换去除后还是有问题的

gxmanito avatar Dec 02 '24 06:12 gxmanito

断点调试下 AbstractSQLExecutor.execute 中对 JOIN 查到 ResultSet 后分离 主、副 表数据的处理 https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLExecutor.java#L390-L584

如果这里没问题,也可能是后面对 User:a 生成的缓存 SQL 与对 User:b 生成的缓存 SQL 一致,导致 AbstractSQLExecuto.getCacheItem 取错了

是缓存取错了,但是暂时没有太好的方案处理,如果去掉缓存会导致n+1查询

gxmanito avatar Dec 02 '24 06:12 gxmanito

把具体的相关代码调试截屏发出来,这样纯文本的一问一答很低效,我也没时间去猜各种可能

TommyLemon avatar Dec 08 '24 04:12 TommyLemon

@gxmanito 解决 SQL JOIN 同名副表返回数据错乱,解决有时 SELECT 和 ON 中的表别名对应错误,解决 Oracle 某些情况下用了不允许的 AS 别名;优化代码 - JOIN 副表未指定 @column 会导致冗余查询 https://github.com/Tencent/APIJSON/commit/e5261ec84c2a6ab1ccf8d666618cc799ebcefb37

Image Image

http://apijson.cn/api/index.html?send=true&type=JSON&url=http%3A%2F%2Flocalhost%3A8080%2Fget&json={%22[]%22:{%22count%22:10,%22page%22:1,%22join%22:%22%3C%2FComment%2C%3C%2FComment%3Ato%22,%22User%22:{%22@column%22:%22id%2Cname%22},%22Comment%22:{%22@column%22:%22id%2CtoId%2CuserId%2Ccontent%22,%22userId@%22:%22%2FUser%2Fid%22,%22toId%3C=%22:0},%22Comment:to%22:{%22toId@%22:%22%2FComment%2Fid%22}},%22@explain%22:true}

TommyLemon avatar Feb 02 '25 11:02 TommyLemon

https://github.com/Tencent/APIJSON/issues/781#issuecomment-2629362746 master分支是否兼容jdk1.8呀

gxmanito avatar Feb 05 '25 07:02 gxmanito

#781 (comment) master分支是否兼容jdk1.8呀

@gxmanito

代码兼容 JDK 1.8,但目前配置打包 JDK 版本是 17,可以改为 JDK 1.8 打包,这样业务项目就能用 JDK 1.8 了: 1.删除 jitpack.yml 文件 https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/jitpack.yml

2.java.version、maven.compiler.source、maven.compiler.target 和 maven-compiler-plugin 中 configuration 的 source、target 都改成 1.8 https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/pom.xml

apijson-framework 已经兼容 JDK 1.8~16 及 SpringBoot 1.4~2.7 了,也可以改为 JDK 1.8 打包。 https://github.com/APIJSON/apijson-framework/releases/tag/7.1.5

TommyLemon avatar Feb 06 '25 15:02 TommyLemon

https://github.com/Tencent/APIJSON/issues/781#issuecomment-2640144322 已成功升级到最新版本,感谢!

不过还是遇到了一个问题,我们项目组要求传参所有必须是驼峰格式,目前@column字段、where条件、出参驼峰均没问题,但是join关联字段时有很大问题,过程也改了很多源码,但是还是各种bug(比如n+1查询等),您有没有一键配置支持所有驼峰的规划呢

Image

Image

Image

Image

Image

gxmanito avatar Feb 08 '25 02:02 gxmanito

@gxmanito JSONResponse.IS_FORMAT_UNDERLINE = true https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/JSONResponse.java#L25-L34

不过这个只对最终返回前端的 JSON key 生效,把数据库的 蛇形命名 字段名 转成 驼峰命名。

你的需求还需要把 on.getKey() 和 on.getOriginKey() 的 驼峰命名 转成数据库的 蛇形命名, 可以在 AbstractSQLConfig 中加个 formatKey 方法,另外 getSQLKey 也调用下 formatKey。

AbstractSQLExecutor 也可以加个 formatKey 方法,把数据库的 蛇形命名 字段名 转成 驼峰命名。

所有涉及 on.getKey() 和 on.getOriginKey() 的代码都可以通过 IDE 对 Join.On 中这两个方法 Find Usages 来查找,避免遗漏。

TommyLemon avatar Feb 08 '25 14:02 TommyLemon