package io.terminus.trantorframework.sdk.sql;
import io.terminus.autumn.model.search.function.SearchQuery;
import io.terminus.trantorframework.Page;
import io.terminus.trantorframework.Paging;
import io.terminus.trantorframework.api.BaseModel;
import io.terminus.trantorframework.api.annotation.SearchSqlType;
import io.terminus.trantorframework.querymodel.QModel;
import io.terminus.trantorframework.sdk.sql.DataStoreClient;
* @Date: 2021/3/8 4:26 下午
private static DataStoreClient dataStoreClient;
* 注意项: 由于搜索模型不支持link字段,这个查询也不支持link查询和join查询。
* 此方法不支持ES的深度分页,from(page)+size最大不能超过50000。
* 如果要查询这种sql:select name from test_Model where id = ? order by name desc limit 0,10
* modelClass->test_Model.class
* where->id =? order by name desc
* 对于params有个特殊的语法,当查询条件是 where id in (?) 时,params可以是一个数组。比如[1,2,3,4]。
* 最终解析的sql为 where id in (1,2,3,4)
* public class TestModel extends BaseModel<Long> {
* String where = "id in (1,2,3,4) order by name desc";
* Paging<TestModel> testModelList = Search.paging(TestModel.class, select, where, new Page(0,20));
* String where = "id in (?) order by name desc";
* Paging<TestModel> testModelList = Search.paging(TestModel.class, select, where, new Page(0,20), a);
public static <Model extends BaseModel<Long>> Paging<Model> paging(Class<Model> modelClass, String select,
String where, Page page, Object... params) {
return dataStoreClient.paging(modelClass, select, where, page, SearchSqlType.ES.getIsSearchSql(), params);
* 如果要查询这种sql:select count(*) from test_Model where id = ? order by name desc
* modelClass->test_Model.class
* where->id =? order by name desc
* String where = "id in (1,2,3,4) order by name desc";
* long total = Search.count(TestModel.class, where);
* String where = "id in (?) order by name desc";
* long total = Search.count(TestModel.class, where, a);
public static <Model extends BaseModel<Long>> long count(Class<Model> modelClass, String where, Object... params) {
return dataStoreClient.count(modelClass, where, SearchSqlType.ES.getIsSearchSql(), params);
* find接口就是不加分页的查询,由于不加分页容易导致内存oom。所以这个接口最好只作为分组接口使用,目前能查询到数据最大个数为50000。
* 分组查询最多分组2147483647(Integer的最大值)条
* sql:select sum(id) as id_sum,count(name) as name_count,name from testModel where id = ? group by name order by name desc
* 搜索根据name分组后的sum(id)和count(name)
* 返回结果: List<Map<String, Object>>。每一个map的格式:
* String sql = "select sum(id) as id_sum,count(name) as name_count,name from testModel where" +
* " id in (1,2,3,4) group by name order by name desc";
* List<Map<String, Object>> mapList = Search.find(sql);
* String sql = "select sum(id) as id_sum,count(name) as name_count,name from testModel where" +
* " id in (?) group by name order by name desc";
* List<Map<String, Object>> mapList = Search.find(sql,a);
* @return List<Map<String, Object>>格式结果集
public static List<Map<String, Object>> find(String sql, Object... params) {
return dataStoreClient.find(sql, SearchSqlType.ES.getIsSearchSql(), params);
* @param queryModel QModel对象
public static <Model extends BaseModel<Long>> Paging<Model> paging(QModel<Model> queryModel) {
return dataStoreClient.paging(queryModel, SearchSqlType.ES.getIsSearchSql());
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.rangeQuery(TestModel.intField_field, 1, 10).boosts(2.00f)));
* Paging<TestModel> testModelList = Search.searchDSL(TestModel.class, new Page(0, 20),searchQuery);
* 翻译成sql为: select * from testModel where intField>1 and intField<10 limit 0,20
* @param searchQuery searchQuery对象
public static <Model extends BaseModel<Long>> Paging<Model> searchDSL(Class<Model> modelClass, Page page, SearchQuery searchQuery) {
return dataStoreClient.searchDSL(modelClass, page, searchQuery);
* 对于SearchQuery来说,这个接口最好用于查询聚合函数接口。
* 如果想要查询source里的数据,默认返回结果数据是10条。需要手动设置from和size,设置方式如下:
* searchQuery.from(0).size(100)
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.wildcardQuery(TestModel.stringField_field, "描述").boosts(2.00f)))
* .aggregation(agg -> agg.terms(TestModel.stringField_field + "_alias", TestModel.stringField_field)
* .min(TestModel.intField_field + "_min", TestModel.intField_field));
* List<Map<String, Object>> mapList = Search.find(TestModel.class, searchQuery);
* 翻译成sql为: select stringField as stringField_alias,min(intField) as intField_min from testModel where stringField like '%描述%' group by stringField;
* @param searchQuery searchQuery对象
* @return List<Map<String, Object>>格式结果集
public static <Model extends BaseModel<Long>> List<Map<String, Object>> find(Class<Model> modelClass, SearchQuery searchQuery) {
return dataStoreClient.find(modelClass, searchQuery);
* https://trantor-docs.app.terminus.io/v1.x/doc/ds-search/ds-search-userguide
* SearchQuery searchQuery = new SearchQuery();
* searchQuery.where(a -> a.bool()
* .must(a.rangeQuery(TestModel.intField_field, 1, 10).boosts(2.00f)));
* long total = Search.count(TestModel.class, searchQuery);
* 翻译成sql为: select count(*) from testModel where intField>1 and intField<10
* @param searchQuery searchQuery对象
public static <Model extends BaseModel<Long>> long count(Class<Model> modelClass, SearchQuery searchQuery) {
return dataStoreClient.count(searchQuery, modelClass);