查询

API 概览

1. CRUD API

查询 添加 修改 删除
all
query updateByQuery deleteByQuery
queryPager
queryByCondition updateByCondition deleteByCondition
queryByField updateByField deleteByField
getById add update deleteById
getByField

说明 :

  1. oor 提供了 Table View 两个构造器

    区别就是 View 实体 只包含查询相关 API,而 Table 实体 包含全部 API。

  2. 后两行API :getById / getByField / add / update /deleteById

    操作单个对象,其它API操作多个对象。

  3. 查询 QuerySchemaCondition 结构同构也适用于 update/delete

2. 自定义 API

除以上 CRUD 操作外,所有对象还包括两个API,用于自定义扩展

  1. exec() : 等同于数据库连接的 query 方法 (pg/mysql), 或 search 方法(es)
  2. getClient() : 获取数据连接对象,用于调用一些更底层的方法。

查询结构:QuerySchema

  1. 查询结构体是一个对象
  2. 固定参数自定义参数 组成
  3. 固定参数_ 结尾
  4. 自定义参数 支持 魔法后缀, 相当于语法糖。
  5. 自定义参数 = 字段名 + 魔法后缀

示例代码

User.query({
    start_: 0,
    count_: 20,
    order_: 'id',
    by_: 'desc',
    idMin: 200,                                 // id > 200
    idNot: 300,                                 // id != 300
    createDateMin : '2022-01-01',               // createDate > 2022-01-01
    createDateMax : new Date('2022-02-01'),     // createDate < 2022-02-01
    nameLike: 'title',                          // name like %title%
    name: 'oor'                                 // product = oor (No Suffix, No Magic )
})

固定参数

参数 类型 说明 默认值
start_ number 开始 0
count_ number 数量 10
order_ string 排序字段 id
by_ 'asc' | 'desc' 排序方法 desc
keyword_ string 关键字(暂不支持)

魔法后缀

固定参数 外,查询体内其它属性,可以由 字段名 + 魔法后缀 组成,没有加后缀时,等同于 =

'Min', 'MinThan', 'Max', 'MaxThan',                 // commom  > , >= , <  ,  <=
'MinH', 'MinD', 'MinM', 'MaxH', 'MaxD', 'MaxM',     // Only Date Hour / Day / Month
'Like', 'Likel', 'Liker',                           // Only String  like leftlike rightlike
'Bt', 'BtD', 'BtY', 'BtM',                          // BETWEEN, support Number/Date ,'BtY', 'BtM', 'BtD' Only  Spport Date
'Not',                                              // != or <>
'IsNull', 'NotNull',                                // isNull or Not NULL           This Suffix will avoid value
'>', '>=', '<', '<=', '=', '!=', '<>'               // Comparison Functions,
'In', 'NotIn'                                       // SQL IN Condition , use "," sperate items, Not support boolean date

详细列表:

后缀 说明 支持 PG/MySql 支持 ES
= 等于 All (default) All (default)
Min , > 大于 All Number, Date
MinThan , >= 大于等于 String, Number, Date Number, Date
Max , < 小于 All Number, Date
MaxThan , <= 小于等于 String, Number, Date Number, Date
MinH 大于等于(小时) Date Date
MinD 大于等于(天) Date Date
MinM 大小等于(月) Date Date
MaxH 小于等于(小时) Date Date
MaxD 小于等于(天) Date Date
MaxM 小于等于(月) Date Date
Like LIKE String String
Likel LEFT LIKE String String
Liker RIGHT LIKE String String
Bt 介于 Number, Date Number, Date
BtD 介于天 Date Date
BtM 介于月 Date Date
BtY 介于年 Date Date
Not ,<>,!= 不等于 String, Number, Boolean String, Number, Boolean
IsNull 为空 All All
NotNull 不为空 All All
In IN String,Number String,Number
NotIn NOT IN String,Number String,Number

Bt , In , NotIn

Bt 的语法类似于 区间记数法 :

一些示例:

示例 说明
{ fieldBt: '1' } field >= 1
{ fieldBt: '[1' } field > 1
{ fieldBt: '(1' } field > 1
{ fieldBt: ',100' } field <= 100
{ fieldBt: ',100]' } field <= 100
{ fieldBt: ',100)' } field < 100
{ fieldBt: '1,100' } field >= 1 AND field <= 100
{ fieldBt: '[1,100)' } field >= 1 AND field < 100
{ fieldBt: '(1,100)' } field > 1 AND field < 100
{ fieldBt: '20201011,2022-10-11 11:11:11' } field > {time-20201011} AND field < { time-2022-10-11 11:11:11}

In NotIn 语法 : In, NotIn 都是以逗号进行分割的字符串。

通用条件:Condition

说明:Condition 可以用于构建极复杂的查询子句。

但并不推荐使用, 因为 Condition 执行时不验证,直接转为 SQL / DSL 执行。

  1. 一个 Condition 可以任意多个 查询Item下级Condition 组成成,Condition 的层级可无限嵌套。
  2. 一个 Item 由 column (注意:数据库字段名称) 和 valuefn 组成, fn 为上面的任意后缀,默认为 '='
  3. Condition 同样也可以做为 updateByCondition / deleteByCondition 操作的条件

分页查询

示例

const condition: WhereParam = {
    link: 'AND',
    items: [
        { column: 'a1', value: 'value1' },
        { column: 'a2', fn: '<', value: 'value2' },
        {
            link: 'OR', items: [
                { column: 'b1', fn: 'Like', value: 'value3' },
                {
                    link: 'NOT', items: [
                        { column: 'd1', value: 'test1' },
                        { column: 'd2', value: 'test2' },
                        {
                            link: 'AND', items: [
                                { column: 'e1', value: 'test6' },
                                { column: 'e2', value: 'test7' },
                            ]
                        }
                    ]
                },
                { column: 'b2', fn: '>=', value: 'value4' },
            ]
        },
        { column: 'a3', fn: '<', value: 'value1' },

    ]
}

await entity.queryByCondition(condition)