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.15k stars 2.15k forks source link

[Bug] 达梦数据库做表左关联时提示有歧义的列名[RN] #690

Open jettisonJava opened 6 months ago

jettisonJava commented 6 months ago

APIJSON Version/APIJSON 版本号

6.3.0

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

达梦8

Environment/环境信息

- JDK/基础库:11.0.16
- OS/系统:windows 10

APIAuto Screenshots/APIAuto 请求与结果完整截屏

代码定位截图(https://img-blog.csdnimg.cn/direct/5f0dfce1c33946148c98beedc89ca038.png) 数据请求截图(https://img-blog.csdnimg.cn/direct/917e8e5e1f2a4e39815a5c384a6109b3.png)

Current Behavior/问题描述

通过翻查源码,发现在AbstractSQLConfig类中,3203行的getOraclePageSql方法中,发现每一个进来的表sql都会默认拼接ROWNUM AS RN 的行数字段,当存在多表关联时,多个表都存在相同的RN列名,导致报错。印象中翻过一个issue有说过APIJSON会将每个相连的表建立alias(不知道是否只有mysql有,而oracle等其他库没有),但实际上达梦(oralce)并没有。包括联表内的字段都没有别名。请求参数中也无法通过建立别名影响RN列的生成。
------------------------
后端生成的sql:
SELECT * FROM (SELECT "Table20240311".*, ROWNUM RN FROM (SELECT "Table20240311".*, "Dd".* FROM "GR_BAS_DYMFORM"."Table20240311" AS "Table20240311"  
   LEFT JOIN ( SELECT * FROM (SELECT "Dd".*, ROWNUM RN FROM (SELECT "id" AS "Dd.id","pid" FROM "GR_BAS_DYMFORM"."Dd") "Dd"  WHERE ROWNUM <= 0) WHERE RN > 0 ) AS "Dd" ON "Dd"."pid" = "Table20240311"."id"  
) "Table20240311"  WHERE ROWNUM <= 50) WHERE RN > 0

--------------
请求参数:
{
    "[]": {
        "join": "</Dd/pid@",
        "Table20240311": {
            "@datasource": "dm",
        },
        "Dd": {
            "pid@": "/Table20240311/id",
            "@datasource": "dm",
            "@column": "id:Dd.id,pid;"
        }, "query": 2,
  "count": 50,
  "page": 0,
    },"info@":"/[]/info","total@":"/[]/total",
}

返回报错结果:
"msg": "第3 行附近出现错误:\n有歧义的列名[RN]",

Expected Behavior/期望结果

能否实现每个联表、字段都自动生成别名,让表字段唯一,互不影响。或者提供对默认的ROWNUM(RN)行数字段别名的修改。

Any additional comments?/其它补充说明?

TommyLemon commented 6 months ago

给和关键词冲突的别名 RN 加上引号,String quote = getQuote(); quote + "RN" + quote https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4596-L4597

image

改好后给 APIJSON提交 PR 贡献,谢谢,开源要大家一起参与贡献才会更美好~ image

提 PR 贡献代码的步骤可参考: https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%80%E5%AE%9A%E8%A6%81%E8%B4%A1%E7%8C%AE%E4%BB%A3%E7%A0%81

jettisonJava commented 6 months ago

升级APIJSONORM 6.4.0版本,测试发现关联表内部不会再出现行数字段,最外层SQL只会在外部产生一个ROWNUM,不再有多个ROWNUM导致字段冲突,问题已解决。 该问题可通过升级>6.3.0版本的APIJSONORM修复。另外在RN字段前后加上quote双引号,显然更符合数据库规范。