資料條件查詢和分頁
前面文檔主要介紹了中繼資料配置,包括表單定義和表關系管理,以及表單資料的錄入,本文主要介紹資料查詢和分頁在crudapi中的實作。
概要
資料查詢API
資料查詢主要是指按照輸入條件檢索出符合要求的資料清單,如果資料量大的情況下,需要考慮分頁。

API為/api/business/{name},其中name為對象名稱複數形式(相容對象名稱),查詢參數如下:
參數 | 類型 | 描述 |
---|---|---|
select | string | 選擇查詢需要的字段和關聯子表,預設查詢全部字段和關聯子表 |
expand | 選擇需要展開的關聯主表,預設關聯主表字段隻查詢id和name | |
search | 全文檢索關鍵字,通過内置的系統字段全文索引fullTextBody實作 | |
filter | 智能查詢條件,格式為Condition對象JSON序列化後的字元串 | |
orderby | 排序方式,ASC和DESC | |
offset | int32 | 分頁開始位置 |
limit | 每頁數量 | |
字段1 | Object | 最終轉換成mysql中=操作符 |
字段2 | ||
...... |
字段1,字段2,...之間的關系為并且AND關系
查詢客戶
字段查詢
客戶customer一共錄入四條資料
分别通過名稱、手機、郵箱、會員卡号進行查詢,請求url如下:
/api/business/customer?offset=0&limit=10&name=劉禅&mobile=13088889999&[email protected]&membershipNo=VIP000000004
查到客戶劉禅
全文檢索
通過關鍵字“劉”對客戶表全文檢索,請求url如下:
/api/business/customer?offset=0&limit=10&search=劉
查到客戶劉禅和劉備,具體原理如下:表單中所啟用了“可查詢”屬性的字段最終拼接成一個全文檢索文本fullTextBody,在插入資料和更新資料的時候及時更新,這樣就可以利用mysql全文檢索功能實作關鍵字查詢, 最終轉成SQL語句如下:
SELECT * FROM `ca_customer`
WHERE ((MATCH(`fullTextBody`) AGAINST('張*' IN BOOLEAN MODE)))
ORDER BY id DESC LIMIT 0, 10
類似的,通過關鍵字“liu”對客戶表全文檢索,通過郵箱比對,也可以查詢資料。
智能查詢原理
定義接口條件Condition,葉子條件LeafCondition繼承Condition,組合條件CompositeCondition條件繼承Condition,CompositeCondition由多個Condition組合而成,通過AND和OR兩種運算可以實作任何形式的複雜查詢條件,這樣就利用組合模式實作了智能查詢,
public enum OperatorTypeEnum {
EQ,
NE,
LIKE,
IN,
INSELECT,
SEARCH,
GE,
GT,
LE,
LT,
BETWEEN
}
資料庫查詢操作符包括等于、大于、LIKE等
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY,property = "name")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = CompositeCondition.class, name = "C"),
@JsonSubTypes.Type(value = LeafCondition.class, name = "L")
})
public interface Condition {
String toQuerySql();
List<Object> toQueryValues();
}
條件接口
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class LeafCondition implements Condition {
private String name = "L";
private String columnName;
@JsonProperty("operatorType")
private OperatorTypeEnum operatorType;
@JsonProperty("values")
private List<Object> valueList = new ArrayList<Object>();
}
葉子條件
@JsonPropertyOrder(alphabetic = true)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class CompositeCondition implements Condition {
private String name = "C";
@JsonProperty("conditionType")
private ConditionTypeEnum conditionType = ConditionTypeEnum.AND;
@JsonProperty("conditions")
private List<Condition> conditionList = new ArrayList<Condition>();
}
組合條件
智能查詢驗證
Postman驗證,首先溝通mobile等于13622228888的葉子條件如下:
{
"name": "L",
"columnName": "mobile"
"operatorType": "EQ",
"values": ["13622228888"]
}
序列化值為:
{"name":"L","columnName":"mobile","operatorType":"EQ","values":["13622228888"]}
通過encodeURIComponent編碼之後為:
%7B%22name%22%3A%22L%22%2C%22columnName%22%3A%22mobile%22%2C%22operatorType%22%3A%22EQ%22%2C%22values%22%3A%5B%2213622228888%22%5D%7D
最終查詢到客戶關羽,因為手機号滿足條件。類似的,可以構造更複雜的組合條件。
字段選擇select
預設情況下會選擇所有字段,select如果不指定表示所有的意思
如果指定了字段,就查詢部分字段,比如隻查詢id,name和mobile,其它字段和子表profile就不需要查詢了,這樣可以節約時間和資料大小。
關聯表擴充expand
子主關系中,預設隻查詢主表id和name,避免主表查詢層次太深。
如果指定expand關聯對象名稱,就查詢主表所有字段,适用不需要延時加載的場景,比如查詢客戶資料時候一起查詢客戶customer完整資訊。
小結
本文介紹了清單查詢API所有的參數,包括智能查詢、全文檢索以及字段選擇等。crudapi系統通過配置的方式實作了對象的查詢和分頁。
附crudapi簡介
本系統屬于産品級的零代碼平台,不同于自動代碼生成器,不需要生成Controller、Service、Repository、Entity等業務代碼,程式運作起來就可以使用,真正0代碼,可以覆寫基本的和業務無關的CRUD RESTful API。