zoukankan      html  css  js  c++  java
  • Hibernate NativeQuery代码优化一则

    使用hibernate,用原始sql查询分页,代码优化过程:

    1.原始版:

            String x = "";
            //补全语句,当然也可以不用判断查询条件,全部生成sql
            if (drugName != null && drugName.equals("") == false) {
                x += "and a.DRUG_NAME like :name ";
            }
            if (approvalNum != null && approvalNum.equals("") == false) {
                x += "and a.PERMIT_NUMBER like :name1 ";
            }
            if (productNum != null && productNum.equals("") == false) {
                x += "and a.P_NUM like :name2 ";
            }
            if (companyName != null && companyName.equals("") == false) {
                x += "and a.PRODUCTION_ENTERPRISES like :name3 ";
            }
            if (shop != null && shop.equals("") == false) {
                x += "and c.PHARMACY_NAME like :name4 ";
            }
            String sql_count = getActiveSql(x,true);
    
            javax.persistence.Query sqlQuery = entityManager.createNativeQuery(sql_count);
            //设置参数
            if (drugName != null && drugName.equals("") == false) {
                sqlQuery.setParameter("name","%" + drugName + "%");
            }
            if (approvalNum != null && approvalNum.equals("") == false) {
                sqlQuery.setParameter("name1", "%" + approvalNum + "%");
            }
            if (productNum != null && productNum.equals("") == false) {
                sqlQuery.setParameter("name2", "%" + productNum + "%");
            }
            if (companyName != null && companyName.equals("") == false) {
                sqlQuery.setParameter("name3", "%" + companyName + "%");
            }
            if (shop != null && shop.equals("") == false) {
                sqlQuery.setParameter("name4", "%" + shop + "%");
            }
            List<BigDecimal> total_obj = sqlQuery.getResultList();
            //返回list查询
            sqlQuery = entityManager.createNativeQuery(getActiveSql(x,false), DrugDistribution.class);
            //设置参数
            if (drugName != null && drugName.equals("") == false) {
                sqlQuery.setParameter("name","%" + drugName + "%");
            }
            if (approvalNum != null && approvalNum.equals("") == false) {
                sqlQuery.setParameter("name1", "%" + approvalNum + "%");
            }
            if (productNum != null && productNum.equals("") == false) {
                sqlQuery.setParameter("name2", "%" + productNum + "%");
            }
            if (companyName != null && companyName.equals("") == false) {
                sqlQuery.setParameter("name3", "%" + companyName + "%");
            }
            if (shop != null && shop.equals("") == false) {
                sqlQuery.setParameter("name4", "%" + shop + "%");
            }
            List<DrugDistribution> list = sqlQuery.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()).setMaxResults(pageable.getPageSize()).getResultList();
            Page<DrugDistribution> page = new PageImpl(list, pageable, totals_obj.get(0).intValue());
            return  page;

    第一版优化,使用数组替代各种if else判断。

    String x = "";
            String[] searchList = {drugName, approvalNum, productNum, companyName, shop};
            String[] columnNameList = {"a.DRUG_NAME", "a.PERMIT_NUMBER", "a.P_NUM", "b.SUPPLIER_NAME", "c.PHARMACY_NAME"};
            for (int i = 0; i < searchList.length; i++) {
                if (searchList[i] != null && searchList[i].equals("") == false) {
                    x += " and " + columnNameList[i] + " like :name" + i;
                }
            }
            String sql_count = getActiveSupplierSql(x, true);
            javax.persistence.Query sqlQuery = entityManager.createNativeQuery(sql_count);
    
            for (int i = 0; i < searchList.length; i++) {
                if (searchList[i] != null && searchList[i].equals("") == false) {
                    sqlQuery.setParameter("name" + i, "%" + searchList[i] + "%");
                }
            }
            List<BigDecimal> totals_obj = sqlQuery.getResultList();
            //
            sqlQuery = entityManager.createNativeQuery(getActiveSupplierSql(x, false), DrugDistribution.class);
            for (int i = 0; i < searchList.length; i++) {
                if (searchList[i] != null && searchList[i].equals("") == false) {
                    sqlQuery.setParameter("name" + i, "%" + searchList[i] + "%");
                }
            }
            List<DrugDistribution> list = sqlQuery.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()).setMaxResults(pageable.getPageSize()).getResultList();
            Page<DrugDistribution> page = new PageImpl(list, pageable, totals_obj.get(0).intValue());
            return page;

    经过精简,代码大幅减少,但是还是有2个相同的for循环,再次进行重构

     String x = "";
            String[] searchList = {drugName, approvalNum, productNum, companyName, shop};
            String[] columnNameList = {"a.DRUG_NAME", "a.PERMIT_NUMBER", "a.P_NUM", "b.SUPPLIER_NAME", "c.PHARMACY_NAME"};
            for (int i = 0; i < searchList.length; i++) {
                if (searchList[i] != null && searchList[i].equals("") == false) {
                    x += " and " + columnNameList[i] + " like :name" + i;
                }
            }
            String sql_count = getActiveSupplierSql(x, true);
            javax.persistence.Query sqlQuery = entityManager.createNativeQuery(sql_count);
            
            sqlQuery = setParameter(sqlQuery, searchList);
            List<BigDecimal> total_obj = sqlQuery.getResultList();
            
            sqlQuery = entityManager.createNativeQuery(getActiveSupplierSql(x, false), DrugDistribution.class);
            sqlQuery = setParameter(sqlQuery, searchList);
            List<DrugDistribution> list = sqlQuery.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()).setMaxResults(pageable.getPageSize()).getResultList();
            Page<DrugDistribution> page = new PageImpl(list, pageable, total_obj.get(0).intValue());
            return page;

    第三次重构:

    public Page<PrescriptionDrugs> getSupplier(Pageable pageable, String tradeName, String salesperson, String beginDate, String endDate) {
            String x = "";
            String[] columnNameList = {"a.TRADE_NAME like ", "b.SALE_BY  like ", "b.SALE_DATE>=", "b.SALE_DATE<"};
            String[] searchList = {tradeName, salesperson, beginDate, endDate};
            String[] prefixList = {"%", "%", "", ""};
            String[] suffixList = {"%", "%", "", ""};
            for (int i = 0; i < searchList.length; i++) {
                if (searchList[i] != null && searchList[i].equals("") == false) {
                    x += " and " + columnNameList[i] + " :name" + i;
                }
            }
            String sql_count = getActiveSupplierSql(x, true);
            javax.persistence.Query sqlQuery = entityManager.createNativeQuery(sql_count);
    
            sqlQuery = setParameter(sqlQuery, searchList, prefixList, suffixList);
            List<BigDecimal> total_obj = sqlQuery.getResultList();
    
            sqlQuery = entityManager.createNativeQuery(getActiveSupplierSql(x, false), PrescriptionDrugs.class);
            sqlQuery = setParameter(sqlQuery, searchList, prefixList, suffixList);
            List<PrescriptionDrugs> list = sqlQuery.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()).setMaxResults(pageable.getPageSize()).getResultList();
            Page<PrescriptionDrugs> page = new PageImpl(list, pageable, total_obj.get(0).intValue());
            return page;
        }

    或者:

     public Page<PrescriptionDrugs> getSupplier(Pageable pageable, String tradeName, String salesperson, String beginDate, String endDate) {
            String x = "";
            String[] columnNameList = {"a.TRADE_NAME like '%'+:par0+'%'", "b.SALE_BY like '%'+:par1+'%'", "b.SALE_DATE>=:par2", "b.SALE_DATE<:par3"};
            String[] searchList = {tradeName, salesperson, beginDate, endDate};
            for (int i = 0; i < searchList.length; i++) {
                x += " and " + columnNameList[i];
            }
            String sql_count = getActiveSupplierSql(x, true);
            javax.persistence.Query sqlQuery = entityManager.createNativeQuery(sql_count);
    
            sqlQuery = setParameter(sqlQuery, searchList);
            List<BigDecimal> total_obj = sqlQuery.getResultList();
    
            sqlQuery = entityManager.createNativeQuery(getActiveSupplierSql(x, false), PrescriptionDrugs.class);
            sqlQuery = setParameter(sqlQuery, searchList);
            List<PrescriptionDrugs> list = sqlQuery.setFirstResult((pageable.getPageNumber()) * pageable.getPageSize()).setMaxResults(pageable.getPageSize()).getResultList();
            Page<PrescriptionDrugs> page = new PageImpl(list, pageable, total_obj.get(0).intValue());
            return page;
        }

    针对for进行再次提炼,此处代码略。

  • 相关阅读:
    ubuntu下安装pip
    [算法]获得最短路径的Floyd与Dijkstra算法
    win2003终端服务授权
    Cookie 读取,解决中文乱码
    MOSS自动备份
    MOSS 开发收藏
    Private Protect Partial Internal Public 区别
    怎么设置OUTLOOK接收邮件时,网站邮箱的原始文件也保存着?
    正则表达式实战
    SQL Server 2005 数据库用户和登录帐户设置关链
  • 原文地址:https://www.cnblogs.com/jizhong/p/13364793.html
Copyright © 2011-2022 走看看