Tencent/APIJSON

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

Open

#690 aperta il 14 mar 2024

Vedi su GitHub
 (4 commenti) (0 reazioni) (0 assegnatari)Java (2229 fork)batch import
Bug 漏洞Damenghelp wanted

Metriche repository

Star
 (17.967 star)
Metriche merge PR
 (Merge medio 4h 34m) (1 PR mergiata in 30 g)

Descrizione

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?/其它补充说明?

Guida contributor