import com.alibaba.fastjson.JSONObject;
import com.unichain.statistics.utils.DateUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Field;
import java.util.*;
public class EsQueryUtils {
private static String esUrl = "http://127.0.0.1:9200/_xpack/sql?format=json";
/** logger */
private static final Logger log = LoggerFactory.getLogger(EsQueryUtils.class);
/**
* esSql查询 sql语句中需要用到参数的地方, 请用#{param} 的形式修饰,#{}符号中间的单词就是第二个参数中的某个键
* @param sql sql语句
* @param params 参数 一个key对应一个参数
* @param className 目标类的class
* @return
*/
public static <T> List<T> query(String sql, Map<String, Object> params, Class<T> className) {
if (StringUtils.isBlank(sql)) {
return new ArrayList<>();
}
log.debug("es查询sql入参 >>> {}", sql);
log.debug("es查询param入参 >>> {}", JSONObject.toJSONString(params));
// 转换sql参数
if (params != null && params.size() != 0) {
params.keySet().forEach(key -> {
sql.replace("#{" + key + "}", params.toString());
});
}
Map<String, Object> query = new HashMap<>();
query.put("query", sql);
JSONObject response = JSONObject.parseObject(HttpUtils.doPost(esUrl, JSONObject.toJSONString(query)));
List<Columns> columns = JSONObject.parseArray(response.getString("columns"), Columns.class);
List<List> rows = JSONObject.parseArray(response.getString("rows"), List.class);
EsModel esModel = new EsModel(columns, rows);
return esModelToJavaObject(esModel, className);
}
/**
* model转换实体类
* @author youao.du@gmail.com
* @param esModel
* @param className
* @param <T>
* @return
*/
private static <T> List<T> esModelToJavaObject(EsModel esModel, Class<T> className) {
Field[] fields = className.getDeclaredFields();
List<T> result = new ArrayList<>(esModel.getRows().size());
esModel.getRows().forEach(row -> {
try {
// 判断是不是基本数据类型
if (!isBasicType(className)) {
// 新增实体
T t = className.newInstance();
for (int i = 0; i < fields.length; i++) {
// 设置该属性可以修改
fields[i].setAccessible(true);
for (int j = 0; j < esModel.getColumns().size(); j++) {
// 判断属性名和es返回的列名一致
Elasticsearch 的sql查询Java工具类
最新推荐文章于 2024-07-16 15:20:05 发布
本文介绍了一个针对Elasticsearch 6版本以上的SQL查询Java工具类,该工具类目前仅封装了查询功能,利用xpack插件进行SQL查询,并将结果转化为目标类。未来计划扩展增删改操作。由于作者已更换工作,部分工具类代码丢失,文中提供了一个经过修改的时间转换方法,需要引入Hutool工具包。
摘要由CSDN通过智能技术生成