APIJSON icon indicating copy to clipboard operation
APIJSON copied to clipboard

oracle联表查询问题

Open sangenmutou opened this issue 3 years ago • 4 comments

环境信息

  • 系统: Windows 10
  • JDK: 1.8.0_17
  • 数据库: oracle 12c
  • APIJSON: 5.0.0

问题描述

1、join目前存在问题,oracle表名不支持as,重写getTablePath()后,inner join可以了,left join依然有问题 2、inner join的问题: 两表联查返回是没问题的,三表联查只能返回主表数据,三个以上的表没有测试 查询的apijson:

{
  "[]": {
    "join": "&/T_user,&/T_role",
    "T_user_role": {
      "@column": "id,user_id,role_id"
    },
    "T_user": {
      "@column": "id:tid",
      "user_id@": "/T_user_role/user_id",
      "id": "1507289794365997058"
    },
    "T_role": {
      "@column": "role_name",
      "id@": "/T_user_role/role_id"
    }
  }
}

返回的结果:

{
  "[]": [
    {
      "T_user_role": {
        "ID": "1522094327143153666",
        "USER_ID": "admin",
        "ROLE_ID": "1507937710264930305"
      }
    },
    {
      "T_user_role": {
        "ID": "1522094327164125186",
        "USER_ID": "admin",
        "ROLE_ID": "1508037483122679810"
      }
    }
  ],
  "ok": true,
  "code": 200,
  "msg": "success"
}

打印的sql是没问题的 SELECT T_user_role.id,T_user_role.user_id,T_user_role.role_id, T_user.id AS tid, T_role.role_name FROM T_user_role T_user_role
INNER JOIN T_user T_user ON T_user.user_id = T_user_role.user_id
INNER JOIN T_role T_role ON T_role.id = T_user_role.role_id
WHERE ( ( ( (T_user.id = '1507289794365997058') ) ) )

3、left join的问题 查询的apijson:

{
  "[]": {
    "join": "</T_user",
    "T_user_role": {
      "@column": "id,user_id,role_id"
    },
    "T_user": {
      "@column": "id:tid",
      "user_id@": "/T_user_role/user_id",
      "id": "1507289794365997058"
    }
  }
}

打印的语句: SELECT T_user_role.id, T_user_role.user_id, T_user_role.role_id, T_user.* FROM T_user_role T_user_role LEFT JOIN (SELECT id AS tid FROM T_user WHERE ((id = '1507289794365997058')) OFFSET 0 ROWS FETCH NEXT 0 ROWS ONLY) AS T_user ON T_user.user_id = T_user_role.user_id left join中依然有 as关键字,不知道如何去掉

想实现的效果为 SELECT T_user_role.id, T_user_role.user_id, T_user_role.role_id, T_user.id tid FROM T_user_role T_user_role LEFT JOIN T_user T_user ON T_user.user_id = T_user_role.user_id and T_user.id = '1507289794365997058'

还请百忙之中,帮忙看下,单表的都测试过了,基本是没有问题的,联表查询用的最多就是inner join和left join,目前没有过于复杂的语句,只需实现最简单的联表查询即可,目前源码也在看,还不熟悉 错误信息

sangenmutou avatar May 09 '22 09:05 sangenmutou

1 和 3 需要去掉 AbstractSQLConfig.getJoinString 4092 行中拼接的 AS https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4092 image

2.请求参数写错了,看下注意事项 https://github.com/Tencent/APIJSON#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 image

TommyLemon avatar May 13 '22 11:05 TommyLemon

谢谢回复,最近更新了最新的代码,按照您的回复,1和2的问题已经解决,近期我把源码改了一些,有个地方希望能够改进一下,oracle分页,希望可以重写,12c之后

	/**Oracle的分页获取
	 * @param config
	 * @param sql
	 * @return
	 */
	protected String getOraclePageSql(String sql) {
		int count = getCount();
		int offset = getOffset(getPage(), count);
		return sql + " OFFSET " + offset + " ROWS FETCH NEXT " + count + " ROWS ONLY";
	}

问题3,left join 想实现文档中的效果 "join":"</ViceTable/key@", "MainTable":{}, "ViceTable":{"key@":"/MainTable/refKey"} 会对应生成 MainTable LEFT JOIN ViceTable ON ViceTable.key=MainTable.refKey AND 其它ON条件

目前还是生成left join (select * from table where 条件) on ,望指正 @TommyLemon

sangenmutou avatar Jul 12 '22 08:07 sangenmutou

默认就是这样生成的,LEFT/RIGHT JOIN 如果主副表条件都在外层同一个 WHERE 中,那和 INNER JOIN 的区别是啥? 直接用 INNER JOIN 就行了,性能还可能更好。

如果想在 ON 上面放自定义条件,可以指定 join 键值对里的条件: http://apijson.cn/api/?send=true&type=JSON&url=http%3A%2F%2Fapijson.cn%3A8080%2Fget&json={%22[]%22:{%22join%22:{%22%3C/User%22:{%22sex%22:0}},%22Comment%22:{%22@explain%22:true},%22User%22:{%22id@%22:%22%2FComment%2FuserId%22,%22@column%22:%22id%2Csex%2Cname%22}}}&setting={%22requestCount%22:1,%22isTestCaseShow%22:false,%22isCrossEnabled%22:true,%22isMLEnabled%22:true,%22isDelegateEnabled%22:false,%22isPreviewEnabled%22:false,%22isEncodeEnabled%22:true,%22isEditResponse%22:false,%22page%22:0,%22count%22:100,%22testCasePage%22:0,%22testCaseCount%22:100,%22testRandomCount%22:1,%22randomPage%22:0,%22randomCount%22:50,%22randomSubPage%22:0,%22randomSubCount%22:50} image

TommyLemon avatar Jul 12 '22 14:07 TommyLemon

改动的源码麻烦提交 PR(Pull Request) 谢谢,开源要大家一起参与才会更美好~ 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

image

TommyLemon avatar Jul 12 '22 14:07 TommyLemon