Skip to content

Oracle多表join查询,主表子表关联字段名相同时SQL报错,建议能够支持主表查询子表字段 #567

Open
@luckychen2025

Description

@luckychen2025

APIJSON Version/APIJSON 版本号

5.4.0

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

Oracle12c

Environment/环境信息

- JDK/基础库:1.8.0_17
- OS/系统:Linux

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

暂无

Current Behavior/问题描述

现有系统架构为SpringMVC+Oracle,最近深度使用了Apijson的多表查询功能。我这边的Oracle应用场景是使用各种join拼接非常多的表进行关联查询,看了目前的issue感觉如果使用join就必须要改下源码,参考了#393,更改了AS之后还是存在关联字段重定义报错的问题,不清楚之前有没有人碰到过。查看输出SQL,发现join子句被包了一层select-from结构,如果主表和子表都有相同的字段就会导致SQL执行报错。目前是临时改了下AbstractSQLConfig的相关代码,把select-from结构去掉而直接进行join子表,然后根据有没有传递@column参数来跳过子SQL生成的递归队列,把子表的字段放在主表的@column参数里进行查询,暂时先跑起来了。还有一些数据缓存问题,没搞清楚哪里来的暂时注释掉了。还有些小问题,建议官方可以考虑下oracle的支持。

1.首先使用的是非join模式下的多表查询,这种方式会先执行主表sql,再执行子表sql,而且子表查询个数与主表查询结果相关。实测oracle最大游标设置是500情况下,查询page=350左右可以正常使用,数据再大则出现了cursor游标越界。

{
  "[]": {
    "MAIN_INFO": {
      "@column": "SR_NO_ID;PRD_ID;INFO_NM",
      "@schema": "T",
      "INFO_NM": "qqq",
      "@raw":"@column"
    },
    "SUB_A": {
      "@column": "A_NM;A_ADRS",
      "@schema": "T",
      "SR_NO_ID@": "/MAIN_INFO/SR_NO_ID"
    },
    "SUB_B": {
      "@column": "B_NM",
      "@schema": "T",
      "PRD_ID@": "/MAIN_INFO/PRD_ID"
    },
    "count": 200,
    "page": 0,
    "query": 2
  },
  "info@": "/[]/info",
  "total@": "/[]/total"
}

2.参考了#393中描述的源码修改方案,修改了拼接AS问题,但是Join时会出现主表子表关联字段重名导致的SQL报错。查看输出SQL,发现join子句被包了一层select-from结构。其实oracle应用需求比较简单,只要能完成多表连接并分页就可以,目前是临时改了下代码跑通了。调试的时候还发现了缓存数据有点问题,暂时给注释了。

```json
{
  "[]": {
    "join":"</SUB_A,</SUB_B",
    "MAIN_INFO": {
      "@column": "MAIN_INFO.SR_NO_ID;PRD_ID;INFO_NM;SUB_A.A_NM;SUB_A.A_ADRS;SUB_B.B_NM",
      "@order": "SR_NO_ID-",
      "@schema": "T",
      "INFO_NM": "qqq",
      "SUB_A.A_NM": "xxx.png"
    },
    "SUB_A": {
      "@schema": "T",
      "SR_NO_ID@": "/MAIN_INFO/SR_NO_ID"
    },
    "SUB_B": {
      "@schema": "T",
      "PRD_ID@": "/MAIN_INFO/PRD_ID"
    },
    "count": 500,
    "page": 0,
    "query": 2
  },
  "info@": "/[]/info",
  "total@": "/[]/total"
}

### Expected Behavior/期望结果

是否能提供官方的支持Oracle的解决方案

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

_No response_

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions