Tencent / APIJSON

🏆 实时 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构 🏆 Real-Time coding-free, powerful and secure ORM 🚀 providing APIs and Docs without coding by Backend, and the returned JSON of API can be customized by Frontend(Client) users
http://apijson.cn
Other
17.31k stars 2.16k forks source link

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

Open gxmanito opened 5 days ago

gxmanito commented 5 days ago

Description

APIJSON Version/APIJSON 版本号 6.3.0

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

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

image

TommyLemon commented 2 days ago

断点调试下 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 commented 2 days ago

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

TommyLemon commented 2 days ago

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

gxmanito commented 23 hours ago

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

升级版本暂时不能升级的

gxmanito commented 23 hours ago

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

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

gxmanito commented 23 hours ago

断点调试下 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查询