关注JEECG发展历程 关注最新动态和版本, 记录JEECG成长点滴 更新日志 - 技术支持 - 招聘英才

JEECG最新版本下载 JEECG智能开发平台 - 显著提高开发效率 常见问题 - 入门视频 - 参与开源团队

商务QQ: 69893005、418799587 商务热线(5*8小时): 010-64808099 官方邮箱: jeecgos@163.com

12
返回列表 发新帖
楼主: String

开一贴分享自己用jeecg3.7所遇所感

[复制链接]
发表于 2017-12-11 11:56:39 | 显示全部楼层
楼主V5
发表于 2017-12-22 21:56:44 | 显示全部楼层
大神,赞一个
 楼主| 发表于 2018-6-12 19:57:54 | 显示全部楼层
好久不来虽然不用了,发布下之前的查询封装类吧
 楼主| 发表于 2018-6-12 20:12:32 | 显示全部楼层
本帖最后由 String 于 2018-6-12 20:19 编辑

很久之前封装的一套全新查询,实现直接按照条件查询,无需过多代码。
用法:
  1. @RequestMapping(params = "datagrid")
  2. public void datagrid(XxxEntity xxxEntity, HttpServletRequest request, HttpServletResponse response,
  3. DataGrid dataGrid) {
  4. HqlQuery hqlQuery=new HqlQuery(XxxEntity.class, request.getParameterMap(), dataGrid);
  5. HqlQuery hQuery=DeclareHql.declareHql(hqlQuery);
  6. Query query=systemService.getSession().createQuery(hqlQuery.getHql());
  7. DeclareHql.setQuery(hQuery, query).getValue(query, dataGrid);
  8. TagUtil.datagrid(response, dataGrid);
  9. }
复制代码
封装类:
  1. /**
  2. * Copyright 2018 String
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. * <p>
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
复制代码
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.jeecgframework.core.common.hibernate.hql.HqlQuery;
import org.jeecgframework.core.common.model.json.DataGrid;

import javax.persistence.Column;
import javax.persistence.JoinColumn;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.Collator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
* hql基本封装
*
* @author String
*/
public class DeclareHql {

    private static final Logger logger = Logger.getLogger(DeclareHql.class);
    private static final String SELECT = "select ";
    private static final String AND = " AND ";
    private static final String FROM = " from ";
    private static final String BLANK = " ";
    private static final String DOT = ".";
    private static final String LEFT_JOIN = " left join ";
    private static final String ORDER_BY = " order by ";
    private static final String EQ = " = ";
    private static final String LIKE = " like ";

    /**
     * 时间查询符号
     */
    private static final String END = "_end2";
    private static final String BEGIN = "_begin1";

    private static final SimpleDateFormat time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

    /**
     * 封装进数据 判断自定义字段排序问题
     *
     * @return
     */
    public void getValue(Query query, DataGrid dataGrid) {
        List<?> li = query.list();
        int total = li.size();
        Class<?> cla = dataGrid.getCla();
        boolean flag = true;
        if (StringUtils.isNotEmpty(dataGrid.getSort())) {
            Method method = getGetMethod(cla, dataGrid.getSort());//获取get方法
            if (method != null) {
                Column column = method.getAnnotation(Column.class);//获取get方法上注解
                if (column == null) {
                    JoinColumn join = method.getAnnotation(JoinColumn.class);
                    if (join == null) {
                        flag = false;
                    }

                }
            }
        }

        List<?> testList = new ArrayList<>();
        if (!flag) {
            testList = li;
        } else
            testList = query.setFirstResult((dataGrid.getPage() - 1) * dataGrid.getRows())
                    .setMaxResults(dataGrid.getRows()).list();
        dataGrid.setResults(testList);
        dataGrid.setTotal(total);
    }

    /**
     * setquery进值
     *
     * @param query
     * @return
     */
    public static DeclareHql setQuery(HqlQuery hqlQuery, Query query) {
        if (hqlQuery.getData().size() > 0) {
            int num = hqlQuery.getNum();
            for (Map<String, Object> obj1 : hqlQuery.getData()) {
                Object datatype = obj1.get("model");
                Object value = obj1.get("value");
                switch (datatype.toString()) {
                    case "Integer":
                        query.setInteger(num, Integer.valueOf((String) value));
                        num++;
                        break;
                    case "String":
                        query.setString(num, value.toString());
                        num++;
                        break;
                    case "Date":
                        Date date = (Date) value;
                        query.setDate(num, date);
                        num++;
                        break;
                    default:
                        break;
                }
            }
        }
        return new DeclareHql();
    }

    /*
     * 拼装h q l脚本  h q l
     */
    public static HqlQuery declareHql(HqlQuery hqlQuery) {
        Class<?> clazz = hqlQuery.getEntityClass();
        Map<String, String[]> paramsMap = hqlQuery.getParamsMap();
        DataGrid datagrid = hqlQuery.getDataGrid();
        hqlQuery.getDataGrid().setCla(clazz);
        Field[] declaredFields = clazz.getDeclaredFields();
        String obj = clazz.getSimpleName();// 对象名
        String otherName = obj.substring(0, 3).toLowerCase();//前缀小写用作hql别名
        StringBuffer sb = new StringBuffer();
        boolean isPropertyFlag = false;//检验排序字段是否属于实体中的属性  存在更改为 true
        
        sb.append(SELECT + otherName + FROM + obj + BLANK + otherName);
        for (Field field : declaredFields) {//存在外键关联的 left join拼接上hql
            String type = field.getType().getName();// 类型
            String property = field.getName();// 属性名
            if (StringUtils.isNotEmpty(datagrid.getSort())) {
                if (datagrid.getSort().equals(property))
                    isPropertyFlag = true;
            }
            try {
                Class<?> cla = Class.forName(type);
                if (!isJavaClass(cla)) {// 自定义属性 left join
                    sb.append(LEFT_JOIN + otherName + DOT + property + BLANK + property);
                }
            } catch (ClassNotFoundException e) {
//                                logger.error(e);
//                                throw new BusinessException("查询出现问题,请联系开发");
                continue;
            }
        }
        sb.append(" where 1=1 ");

        
        /**--------添加自定义h q l(注意别名)------------------*/
        /**先拼接开发写的hql语句以及query值*/
        if (StringUtils.isNotBlank(hqlQuery.getAddHql())) {
            int num = 0;
            for (char c : hqlQuery.getAddHql().toCharArray()) {
                if (c == '?')
                    num++;
            }
            hqlQuery.setNum(num);
            sb.append(AND);
            sb.append(hqlQuery.getAddHql());
        }


        List<Object> valuelist = new ArrayList<>();
        Map<String, Date> dataMap = new HashMap<>();
        List<Map<String, Object>> data = new ArrayList<>();
        Map<String, Object> map1 = null;
      
        if (hqlQuery.isFlag()) {
            sb.append(" and " + otherName + DOT + "sysCompanyCode=? ");
            map1 = new HashMap<>();
            map1.put("model", "String");
            map1.put("value", ResourceUtil.getCompany());
            data.add(map1);
        }


        for (Field field : declaredFields) {
            map1 = new HashMap<>();
            String type = field.getType().getName();// 类型
            String property = field.getName();// 属性名
            String beginValue = null, endValue = null; // 判断区间
            try {
                Class<?> cla = Class.forName(type);
                if (type.contains("java.lang") || type.contains("java.math")) {//普通类型
                    if (paramsMap.containsKey(property)) {
                        if (!StringUtil.isEmpty(paramsMap.get(property)[0])) {
                            if (type.equals("java.lang.Integer")) {
                                sb.append(AND + otherName + DOT + property + EQ + " ?");
                                map1.put("model", "Integer");
                                map1.put("value", paramsMap.get(property)[0].trim());
                                data.add(map1);
                            } else {
                                sb.append(AND + otherName + DOT + property + LIKE + " ? ");
                                map1.put("model", "String");
                                map1.put("value", "%" + paramsMap.get(property)[0].trim() + "%");
                                data.add(map1);
                            }
                        }
                    }
                } else if (type.contains("java.util.Date")) {//时间类型
                    Map<String, Object> map2;
                    if (paramsMap.containsKey(property + BEGIN)) {
                        beginValue = paramsMap.get(property + BEGIN)[0].trim();
                    }
                    if (paramsMap.containsKey(property + END)) {
                        endValue = paramsMap.get(property + END)[0].trim();
                    }
                    if (paramsMap.containsKey(property)) {
                        beginValue = endValue = paramsMap.get(property)[0].trim();
                    }
                    try {
                        /*if(paramsMap.containsKey(property)){
                         *//*beginValue = endValue = paramsMap.get(property)[0].trim();*//*
                                                        String d = paramsMap.get(property)[0].trim();
                                                        if(d!=null&&!"".equals(d)){
                                                                sb.append(AND +otherName+DOT+ property + " between ? and ?");
                                                                map2 = new HashMap<>();
                                                                map2.put("model", "Date");
                                                                map2.put("value", time.parse(d + " 00:00:00"));
                                                                data.add(map2);
                                                                map2 = new HashMap<>();
                                                                map2.put("model", "Date");
                                                                map2.put("value", time.parse(d + " 23:59:59"));
                                                                data.add(map2);
                                                        }

                                                }*/
                        if (org.apache.commons.lang.StringUtils.isNotBlank(beginValue)) {
                            sb.append(AND + otherName + DOT + property + ">= ? ");
                            map2 = new HashMap<>();
                            map2.put("model", "Date");
                            map2.put("value", time.parse(beginValue + " 00:00:00"));
                            data.add(map2);
                        }

                     

                        if (org.apache.commons.lang.StringUtils.isNotBlank(endValue)) {
                            sb.append(AND + otherName + DOT + property + "< ? ");
                            map2 = new HashMap<>();
                            map2.put("model", "Date");
                            map2.put("value", time.parse(GetDateUtil.getDay(endValue, 1, "yyyy-MM-dd") + " 00:00:00"));
                            data.add(map2);
                        }
                    } catch (ParseException e) {
                        e.printStackTrace();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } else if (!isJavaClass(cla)) {
                    Map<String, String> objMap = obj(paramsMap, property);
                    if (objMap != null) {
                        for (Map.Entry<String, String> entry : objMap.entrySet()) {
                            sb.append(AND + entry.getKey() + LIKE + " ? ");
                            map1.put("model", "String");
                            map1.put("value", "%" + entry.getValue() + "%");
                            data.add(map1);
                        }
                    }
                }

            } catch (ClassNotFoundException e) {
                continue;
//                                logger.error(e);
//                                throw new BusinessException("代码开了小差,请联系开发");
            }
        }
        hqlQuery.setData(data);
        //加进拦截器
        String interceptorHql = JeecgDataAutorUtils.loadDataSearchConditonSQLString();
        if (StringUtils.isNotEmpty(interceptorHql)) {
            if (interceptorHql.substring(0, 4).indexOf("and") == -1)
                sb.append(AND);
            sb.append(BLANK + interceptorHql);
        }
        //自定义拦截器hql
        //排序
        if (datagrid != null)
            if (StringUtils.isNotEmpty(datagrid.getSort())) {
              
                if (isPropertyFlag)
                    sb.append(BLANK + ORDER_BY + otherName + DOT + datagrid.getSort() + BLANK + datagrid.getOrder());
               
            }
        hqlQuery.setValueList(valuelist);//query条件
        hqlQuery.setDataMap(dataMap);//query时间
        hqlQuery.setHql(sb.toString());
        return hqlQuery;
    }


    /**
     * 解决前端有自定义的字段 排序问题
     *
     * @param clazz 实体
     * @param dataGrid 已经查询过的datagrid
     * @param isEntity 是否是实体
     * @return
     */
    static String property = null;

    @SuppressWarnings("unchecked")
    public static List<?> sortList(Class<?> clazz, DataGrid dataGrid, boolean isEntity) {
        String sortColumn = dataGrid.getSort();
        if (StringUtils.isEmpty(sortColumn)) {
            return null;
        }
        if (sortColumn.indexOf(".") != -1) {
            return null;
        }
        Method method = getGetMethod(clazz, sortColumn);//获取get方法
        if (method != null) {
            Column column = method.getAnnotation(Column.class);//获取get方法上注解
            if (column != null) {
                return null;
            } else {
                JoinColumn join = method.getAnnotation(JoinColumn.class);
                if (join != null) {
                    return null;
                }
            }
        }
        property = sortColumn;
        List<Map<String, Object>> m = new ArrayList<>();
        if (isEntity) {
            List<?> list = dataGrid.getResults();
            Map<String, Object> map = null;
            for (Object c : list) {
                map = new HashMap<>();
                map = MapBean.BeanToMap(c);
                m.add(map);
            }
        } else {
            m = dataGrid.getResults();
        }
        Collections.sort(m, new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                String s1 = (String) o1.get(property);
                String s2 = (String) o2.get(property);
                Collator collator = Collator.getInstance();
                return collator.getCollationKey(s1).compareTo(
                        collator.getCollationKey(s2));
            }
        });
        if ("desc".equals(dataGrid.getOrder())) {
            Collections.reverse(m);
        }
        //dataGrid.setResults(m);
        return m;
    }

    /**
     * java反射bean的get方法
     *
     * @param objectClass
     * @param fieldName
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Method getGetMethod(Class<?> objectClass, String fieldName) {
        StringBuffer sb = new StringBuffer();
        sb.append("get");
        sb.append(fieldName.substring(0, 1).toUpperCase());
        sb.append(fieldName.substring(1));
        try {
            return objectClass.getMethod(sb.toString());
        } catch (Exception e) {
        }
        return null;
    }


    private static Map<String, String> obj(Map<String, String[]> map, String property) {
        for (Map.Entry<String, String[]> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue()[0];
            if (key.contains(".") && key.substring(0, key.indexOf(".")).equals(property)) {
                if (!StringUtil.isEmpty(value)) {
                    Map<String, String> result = new HashMap<>();
                    result.put(key, value);
                    return result;
                }
            }
        }
        return null;
    }

    /**
     * 系统类型
     *
     * @param clz
     * @return
     */
    public static boolean isJavaClass(Class<?> clz) {
        return clz != null && clz.getClassLoader() == null;
    }

}
  1. /**
  2. * Copyright 2018 String
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. * <p>
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
复制代码
import org.hibernate.Query;
import org.jeecgframework.core.common.model.json.DataGrid;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
* 对hql封装
* @author String
*
*/
public class HqlQuery {
        private int curPage = 1;// 当前页
        private int pageSize = 10;// 默认一页条数
        private Class<?> entityClass;//POJO
        private  Map<String, String[]> paramsMap; //查询的条件
        private int total;//总页数
        private DataGrid dataGrid;
        private List<?> valueList;//条件集合
        private Map<String,Date> dataMap;
        private String hql;
        private Query query;
        private Integer num=0;//记录query数据?标示位数
        List<Map<String,Object>> data;
        private String addHql;
        private boolean flag=false;//公司标示
        
        
        public boolean isFlag() {
                return flag;
        }
        public void setFlag(boolean flag) {
                this.flag = flag;
        }
        public Integer getNum() {
                return num;
        }
        public void setNum(Integer num) {
                this.num = num;
        }
        public String getAddHql() {
                return addHql;
        }
        public void setAddHql(String addHql) {
                this.addHql = addHql;
        }
        public int getCurPage() {
                return curPage;
        }
        public void setCurPage(int curPage) {
                this.curPage = curPage;
        }
        public int getPageSize() {
                return pageSize;
        }
        public void setPageSize(int pageSize) {
                this.pageSize = pageSize;
        }
        public Map<String, String[]> getParamsMap() {
                return paramsMap;
        }
        public void setParamsMap(Map<String, String[]> paramsMap) {
                this.paramsMap = paramsMap;
        }
        public Class<?> getEntityClass() {
                return entityClass;
        }
        public void setEntityClass(Class<?> entityClass) {
                this.entityClass = entityClass;
        }
        public int getTotal() {
                return total;
        }
        public void setTotal(int total) {
                this.total = total;
        }
        public DataGrid getDataGrid() {
                return dataGrid;
        }
        public void setDataGrid(DataGrid dataGrid) {
                this.dataGrid = dataGrid;
        }
        public List<?> getValueList() {
                return valueList;
        }
        public void setValueList(List<?> valueList) {
                this.valueList = valueList;
        }
        public String getHql() {
                return hql;
        }
        public void setHql(String hql) {
                this.hql = hql;
        }
        public HqlQuery(Class<?> entityClass, Map<String, String[]> paramsMap, DataGrid dataGrid) {
                super();
                this.entityClass = entityClass;
                this.paramsMap = paramsMap;
                this.dataGrid = dataGrid;
        }
        public HqlQuery(Class<?> entityClass, Map<String, String[]> paramsMap, DataGrid dataGrid,Boolean flag) {
                super();
                this.entityClass = entityClass;
                this.paramsMap = paramsMap;
                this.dataGrid = dataGrid;
                this.flag=flag;
        }
        public Map<String, Date> getDataMap() {
                return dataMap;
        }
        public void setDataMap(Map<String, Date> dataMap) {
                this.dataMap = dataMap;
        }
        public HqlQuery() {
                super();
        }
        public Query getQuery() {
                return query;
        }
        public void setQuery(Query query) {
                this.query = query;
        }
        public List<Map<String, Object>> getData() {
                return data;
        }
        public void setData(List<Map<String, Object>> data) {
                this.data = data;
        }
        

}
  1. import java.text.DateFormat;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Calendar;
  5. import java.util.Date;

  6. public class GetDateUtil {
  7.         
  8.         /**
  9.          * 获取周期开始时间
  10.          * @param startTime 上次开始时间
  11.          * @param now 当前时间
  12.          * @param n 周期长度
  13.          * @param unit 周期单位
  14.          * @return 包含当前时间的周期开始时间
  15.          * @throws Exception
  16.          */
  17.         public Date getStartTime(Date startTime,Date now,int n,String unit) throws Exception{
  18.                 Calendar cal = Calendar.getInstance();
  19.                 Date endTime = new Date();
  20.                 if("0".equals(unit)){
  21.                         endTime = getHour(startTime, n);
  22.                 }else if("1".equals(unit)){
  23.                         endTime = getDay(startTime, n);
  24.                 }else if("2".equals(unit)){
  25.                         endTime = getTheWeekMonday(startTime, n);
  26.                 }else if("3".equals(unit)){
  27.                         endTime = getTheMonthDay(startTime, n);
  28.                 }else{
  29.                         endTime = getDay(startTime, n);
  30.                 }
  31.                 if(startTime.before(now)&&endTime.after(now)){
  32.                         cal.setTime(startTime);
  33.                 }else{
  34.                         startTime.setTime(endTime.getTime());
  35.                         startTime = getStartTime(startTime, now, n, unit);
  36.                         cal.setTime(startTime);
  37.                 }
  38.                
  39.                
  40.                 return cal.getTime();
  41.         }
  42.         
  43.         /**
  44.          * 返回某个时间的N小时后时间
  45.          * @param date
  46.          * @param n
  47.          * @return 某小时
  48.          * @throws Exception
  49.          */
  50.         public static Date getHour(Date date,int n) throws Exception{
  51.                 Calendar cal = Calendar.getInstance();
  52.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH");
  53.                 date = sdf.parse(sdf.format(date));
  54.                 cal.setTime(date);
  55.                 cal.add(Calendar.HOUR_OF_DAY, n);
  56.                
  57.                 return cal.getTime();
  58.         }
  59.         /**
  60.          * 返回某天后N的天日期
  61.          * @param date
  62.          * @param n
  63.          * @return 日期
  64.          * @throws Exception
  65.          */
  66.         public static Date getDay(Date date,int n) throws Exception{
  67.                 Calendar cal = Calendar.getInstance();
  68.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  69.                 date = sdf.parse(sdf.format(date));
  70.                 cal.setTime(date);
  71.                 cal.add(Calendar.DAY_OF_MONTH, n);
  72.                
  73.                 return cal.getTime();
  74.         }
  75.         
  76.         
  77.         /**
  78.          * 查询n周后周一
  79.          * @param date 当前时间
  80.          * @param n
  81.          * @return 返回n周后周一
  82.          */
  83.         public static Date        getTheWeekMonday(Date date,int n) throws Exception{
  84.                 Calendar cal = Calendar.getInstance();
  85.                 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  86.                 date = sdf.parse(sdf.format(date));
  87.                 cal.setTime(date);
  88.                 int i = cal.get(Calendar.DAY_OF_WEEK);
  89.                 if(i==Calendar.SUNDAY){
  90.                         cal.add(Calendar.WEEK_OF_YEAR, n-1);// 当前日期的下周一
  91.                 }else{
  92.                         cal.add(Calendar.WEEK_OF_YEAR, n);// 当前日期的下周一
  93.                 }
  94.                 cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
  95.                
  96.                 return cal.getTime();
  97.         }
  98.         
  99.         /**
  100.          * 返回当前日期的下N月1号
  101.          * @param date 当前日期
  102.          * @return 当前日期的n月后1号
  103.          * @throws Exception
复制代码
发表于 2018-6-14 10:31:33 | 显示全部楼层
good
发表于 2018-6-20 16:41:39 | 显示全部楼层
给楼主点赞!
发表于 2018-6-20 17:33:30 | 显示全部楼层
.ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;}
这个line_conn.png是不是没上传,没在包里啊。造成点开加载下一级时,连接线没有
 楼主| 发表于 2018-6-26 11:38:39 | 显示全部楼层
推荐一款带工作流的框架 www.gitee.com/bweird/lenosp在线预览地址:www.lenosp.cn
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表