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进行再次提炼,此处代码略。

原文地址:https://www.cnblogs.com/jizhong/p/13364793.html