@
zjp @
GTim @
fkdog @
shayang888 @
gejun123456 不管是注解还是调用 ORM 或 Mapper 的方法,都很难做复杂的查询,尤其是连表查询、子查询等,
而且都要写一堆繁琐的配置,不直观甚至有些还做不了。
APIJSON 就提供了自动化的各种 JOIN
#④ "join":"&/Table0/key0@,</Table1/key1@"
多表连接方式:
"<" - LEFT JOIN
">" - RIGHT JOIN
"&" - INNER JOIN
"|" - FULL JOIN
"!" - OUTTER JOIN
"@" - APP JOIN
其中 @ APP JOIN 为应用层连表,会从已查出的主表里取得所有副表 key@ 关联的主表内的 refKey 作为一个数组 refKeys: [value0, value1...],然后把原来副表 count 次查询 key=$refKey 的 SQL 用 key IN($refKeys) 的方式合并为一条 SQL 来优化性能;
其它 JOIN 都是 SQL JOIN,具体功能和 MySQL,PostgreSQL 等数据库的 JOIN 一一对应,
"ViceTable":{ "key@:".../MainTable/refKey" }
会对应生成
MainTable ... JOIN ViceTable ON ViceTable.key=MainTable.refKey。
例如
{
"[]": {
"join": "&/User/id@,</Comment/momentId@",
"Moment": {
"@order": "date-"
},
"User": {
"@column": "id,name",
"name~": "t",
"id@": "/Moment/userId"
},
"Comment": {
"momentId@": "/Moment/id"
}
}
}
自动生成
SELECT Moment.*,
User.id,
User.name,Comment.* FROM Moment
INNER JOIN User ON
User.id = Moment.userId
LEFT JOIN(
SELECT * FROM Comment
) AS Comment ON Comment.momentId =
Moment.idWHERE
User.name REGEXP 't'
ORDER BY
Moment.date DESC
LIMIT 10 OFFSET 0
#还有自动化子查询
"key@":{
"range": "ALL",
"from":"Table",
"Table":{ ... }
}
其中:
range 可为 ALL,ANY ;
from 为目标表 Table 的名称;
@ 后面的对象类似数组对象,可使用 count 和 join 等功能。
例如
"id@":{
"from":"Comment",
"Comment":{
"@column":"min(userId)"
}
}
自动生成
WHERE id=(SELECT min(userId) FROM Comment)
GitHub 右上角点 Star 支持下吧 ^_^
https://github.com/TommyLemon/APIJSON/blob/master/Document.md#3.2