
# 运算符相关示例
#### 嵌套and、or和in
查询"名称"为"张三"，且"创建者"为"李四"或"修改者"为"王五"、"赵六"的记录。示例如下：
```
{
    "params": {
        "sort": "desc",
        "orderBy": "name",
        "filter": {
            "joiner": "and",
            "conditions": [
                {
                    "conditionName": "name",
                    "operator": "=",
                    "conditionValues": [
                        "张三"
                    ]
                },
                {
                    "joiner": "or",
                    "conditions": [
                        {
                            "conditionName": "creator",
                            "operator": "=",
                            "conditionValues": [
                                "李四"
                            ]
                        },
                        {
                            "conditionName": "modifier",
                            "operator": "in",
                            "conditionValues": [
                                "王五",
                                "赵六"
                            ]
                        }
                    ]
                }
            ]
        }
    }
}
```
如上示例可得出如下查询语句：
```
(name=张三)  and （ (creator=李四) or (modifier in (王五, 赵六) ) ) order by name desc
```
其中，"joiner"用于控制相同层次的"conditions"间的关系。
#### 单个条件
- 示例1：
  ```
  {
      "params": {
          "sort": "desc",
          "orderBy": "name",
          "filter": {
              "conditionName": "name",
              "operator": "=",
              "conditionValues": [
                  "张三"
              ]
          }
      }
  }
  ```
  
- 示例2：
  ```
  {
      "params": {
          "sort": "desc",
          "orderBy": "name",
          "filter": {
              "joiner": "and", // and或者or
              "conditions": [
                  {
                      "conditionName": "name",
                      "operator": "=",
                      "conditionValues": [
                          "张三"
                      ]
                  }
              ]
          }
      }
  }
  ```
  
 
#### 模型自身属性
支持使用ConditionName和orderBy字段。如果输入的入参不是该模型的属性，会提示错误。其错误示例如下所示：
```
{
    "result": "FAIL",
    "data": [],
    "errors": [
        {
            "code": "rdm.coresdk.unknown.exception",
            "message": "unknown exception",
            "detailMessage": "org.hibernate.QueryException: could not resolve property: string of: com.example.it.rdm.bean.module.DM0829002 [from com.example.it.rdm.bean.module.DM0829002 p left join fetch p.master  where p.rdmDeleteFlag = 0  and UPPER(p.string) = UPPER('string') and p.latest = '1' order by p.id desc]"
        }
    ]
}
```
其中，"could not resolve property: string"为具体错误的属性名称。
#### ISNULL和NOTNULL传参
```
{
    "params": {
        "sort": "desc",
        "orderBy": "name",
        "filter": {
            "joiner": "and", // 或者or
            "conditions": [
                {
                    "conditionName": "name",
                    "operator": "ISNULL", // 或者NOTNULL 
                    "conditionValues": [  // conditionValues可不写
                        "张三"
                    ]
                }
            ]
        }
    }
}
```
#### 参考对象
假设TestQuery的参考对象是SimpleEntity（别名为ref），SimpleEntity的别名为ref，有Long类型的ID字段和String类型的Name字段。用户希望对SimpleEntity过滤ID，其示例代码如下所示：
```
{
    "params": {
        "filter": {
            "joiner": "and",
            "conditions": [
                {
                    "conditionName": "ref.id",
                    "operator": "=",
                    "conditionValues": [
                        "406889137980243968"
                    ]
                }
            ]
        }
    }
}
```
如需过滤其他属性，基于新增过滤条件即可。
#### 扩展属性
扩展属性的固定前缀为"extAttrs"，格式有"extAttrs.扩展属性名"和"extAttrs.扩展属性名.value"两种。其中，"extAttrs.扩展属性名.value"适用于自定义精度的扩展属性。
```
{
    "params": {
        "filter": {
            "joiner": "and",
            "conditions": [
                {
                    "conditionName": "extAttrs.extAttrName1",
                    "operator": "=",
                    "conditionValues": [
                        "406889137980243968"
                    ]
                },
{
                    "conditionName": "extAttrs.extAttrName2.value",
                    "operator": "=",
                    "conditionValues": [
                        "12.133"
                    ]
                }
            ]
        }
    }
}
```
#### 分类属性
分类属性的固定前缀为"clsAttrs"，格式有"clsAttrs.分类名.分类内属性名"和"clsAttrs.分类名.分类内属性名.value"两种。其中，"clsAttrs.分类名.分类内属性名.value"适用于自定义精度的分类属性。
```
{
    "params": {
        "filter": {
            "joiner": "and",
            "conditions": [
                {
                    "conditionName": "clsAttrs.clsAttrName.attrName1",
                    "operator": "=",
                    "conditionValues": [
                        "123"
                    ]
                },
{
                    "conditionName": "clsAttrs.clsAttrName.attrName2.value",
                    "operator": "=",
                    "conditionValues": [
                        "12.123"
                    ]
                }
            ]
        }
    }
}
```
#### 扩展类型+扩展属性/分类属性
扩展类型+扩展属性/分类属性的固定前缀为"clsAttrs"，格式有"clsAttrs.分类名.分类内属性名"和"clsAttrs.分类名.分类内属性名.value"两种。其中，"clsAttrs.分类名.分类内属性名.value"适用于自定义精度的扩展类型+扩展属性/分类属性。如需查询此类属性，需额外增加一个过滤条件（rdmExtensionType），用于指明具体的扩展类型。
以"services/dynamic/api/Test0928001/find/20/1"的URI为例：
```
{
    "params": {
        "sort": "DESC",
        "orderBy": "lastUpdateTime",
        "filter": {
            "joiner": "and",
            "conditions": [
                {
                    "conditionName": "clsAttrs.A0001.Testz",
                    "operator": "like",
                    "conditionValues": [
                        "WWW"
                    ]
                },
                {
                    "conditionName": "rdmExtensionType",
                    "operator": "=",
                    "conditionValues": [
                        "Test0928001"
                    ]
                }
              ]
        },
        "isNeedTotal": false
    }
}
```
#### 多字段排序
多字段排序一般使用"sorts"字段表示，其结构如下：
```
{
    "sorts": [
            {
                "sort": "DESC",
                "orderBy": "description"
            }，
            {
                "sort": "ASC",
                "orderBy": "name"
            }
        ]
}
```
使用"sorts"字段后，将按照其列表顺序进行排序。如上所示，对象会先按照"description"进行倒序排序，再按照"name"进行正序排序。
以"services/api/SZAPITEST202211280329/find/20/1"的URI为例，使用如下接口进行多字段排序。
- Find接口：
  ```
  {
      "params": {
          "sorts": [
              {
                  "sort": "DESC",
                  "orderBy": "description"
              }，
              {
                  "sort": "ASC",
                  "orderBy": "name"
              }
          ],
          "filter": {
              "joiner": "and",
              "conditions": [
                  {
                      "conditionName": "description",
                      "operator": "=",
                      "conditionValues": [
                          "a"
                      ]
                  },
                  {
                      "conditionName": "rdmDeleteFlag",
                      "operator": "=",
                      "conditionValues": [
                          "0"
                      ]
                  }
              ]
          }
      }
  }
  ```
  
- Query接口：
  ```
  {
      "params": {
          "sorts": [
              {
                  "sort": "DESC",
                  "orderBy": "description"
              },
              {
                  "sort": "ASC",
                  "orderBy": "name"
              }
          ],
          "filter": {
              "joiner": "and",
              "conditions": [
                  {
                      "conditionName": "description",
                      "operator": "=",
                      "conditionValues": [
                          "a"
                      ]
                  },
                  {
                      "conditionName": "rdmDeleteFlag",
                      "operator": "=",
                      "conditionValues": [
                          "0"
                      ]
                  }
              ]
          }
      }
  }
  ```
  
- Select接口：
  ```
  {
      "params": {
          "selectedField": [
              {
                  "name": "name",
                  "nameAs": "nameAsName"
              },
              {
                  "name": "description",
                  "nameAs": "nameAsDescription"
              },
              {
                  "name": "creator"
              },
              {
                  "name": "id"
              }
          ],
          "sorts": [
              {
                  "sort": "DESC",
                  "orderBy": "name"
              },
              {
                  "sort": "asc",
                  "orderBy": "id"
              }
          ],
          "filter": {
              "joiner": "and",
              "conditions": [
                  {
                      "conditionName": "description",
                      "operator": "=",
                      "conditionValues": [
                          "a"
                      ]
                  }
              ]
          }
      }
  }
  ```
  
 
