美文网首页开发的一些东西
JPA EntityManager createNativeQ

JPA EntityManager createNativeQ

作者: 光影路西法 | 来源:发表于2018-08-18 22:16 被阅读0次

    接(https://www.jianshu.com/p/69fa02602904

    在有某天有这么一个简单的需求,一个页面有N种查询方式,这N种参数可能有也可能没有,

    并且

    ·只要查询其中的某几个字段(表和表有关联)
    ·要有分页
    ·要查询分页后的统计数据(简单,分页后查出来计算也行)
    ·要查询出分页之前所有数据的统计数据 (这……)
    ·需要查询的几个字段和条件有些在一个不关联的第三方表里面……这个表的那个字段有时候是填这个表的id,有时候是其他表的 或者随机字符串数据。
    不能直接做关联。

    处理方法:拼接原生查询 然后用EntityManager的createNativeQuery 来这行原生查询。

    public Query createNativeQuery(String sqlString, Class resultClass);
    

    resultClass是返回的实体类,这个的定义特别重要,由于多个表构成的字段查询,还可能会有sum之类的字段,但又不是真正在数据库有对应的表。

    比如下面的sql

      String sqlstart = "SELECT " +
                    "    operate.id, " +
                    "    usr.real_name, " +
                    "    usr.identity, " +
                    "    depart.title as depart_title, " +
                    "    capital.change_balance, " +
                    "    capital.change_donation, " +
                    "    operate.deposit as change_deposit, " +
                    "    operate.manager_name, " +
                    "    operate.create_time ";
    String sqlend =
                    "FROM " +
                            "    log_card_operate operate LEFT JOIN log_card_capital capital ON operate.id = capital.trade_no, " +
                            "  user usr, " +
                            "    depart depart " +
                            "WHERE " +
                            "  depart.id = usr.depart_id " +
                            " AND usr.id= operate.user_id ";
    

    对应的实体类(注意字段和查询的要一致,下划线会自动对应驼峰,如果有些字段要特殊化命名,可以在sql里起别名)

    import lombok.Data;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Transient;
    import java.io.Serializable;
    import java.math.BigDecimal;
    import java.util.Date;
    
    @Data //lombok
    @Entity //这个注解必备 
    public class StatCardOpen implements Serializable {
        @Transient
        private static final long serialVersionUID = 1L;
        @Id //这个注解必备,必须有个id
        private Integer id;
        private String realName;
        private String identity;
        private String departTitle;
        private BigDecimal changeBalance;
        private BigDecimal changeDonation;
        private BigDecimal changeDeposit;
        private String managerName;
        private Date createTime;
    
    }
    
    

    然后就可以直接查询出所需要的数据:

      Query query = em.createNativeQuery(sqlstart + sqlend + sqlorder, StatCardOpen.class);
       List<StatCardOpen> resultList = query.getResultList();
    

    完整例子:

    public Map<String, Object> openstat(int pageNum, int pageSize, Map<String, Object> params
        ) {
    
            Map<String, Object> resultMap = new HashMap<>();
            params = MapUtil.filterNullHashMapVal(params);
            Integer storeId = params.containsKey("storeId") ? Integer.parseInt(params.get("storeId").toString()) : 0;
            //增减原因 资金变动类型:1-充值、2-发放补贴、3-现金取款、4-补贴取款……
            Integer type = params.containsKey("type") ? Integer.parseInt(params.get("type").toString()) : 0;
            Integer managerId = params.containsKey("managerId") ? Integer.parseInt(params.get("managerId").toString()) : 0;
            Integer departId = params.containsKey("departId") ? Integer.parseInt(params.get("departId").toString()) : 0;
            Date beginTime = params.containsKey("beginTime") ? DateUtils.String2Date(params.get("beginTime").toString(), "yyyy-MM-dd HH:mm:ss") : null;
            Date endTime = params.containsKey("endTime") ? DateUtils.String2Date(params.get("endTime").toString(), "yyyy-MM-dd HH:mm:ss") : null;
            String keyword = params.containsKey("keyword") ? params.get("keyword").toString() : null;
    
            String sqlstart = "SELECT " +
                    "    operate.id, " +
                    "    usr.real_name, " +
                    "    usr.identity, " +
                    "    depart.title as depart_title, " +
                    "    capital.change_balance, " +
                    "    capital.change_donation, " +
                    "    operate.deposit as change_deposit, " +
                    "    operate.manager_name, " +
                    "    operate.create_time ";
            String sqlstartCount = "SELECT operate.id,count(operate.id) as total," +
                    " sum(capital.change_balance) as all_change_balance," +
                    "sum(capital.change_donation) as all_change_donation," +
                    "sum(operate.deposit) as all_change_deposit ";
            String sqlend =
                    "FROM " +
                            "    log_card_operate operate LEFT JOIN log_card_capital capital ON operate.id = capital.trade_no, " +
                            "  user usr, " +
                            "    depart depart " +
                            "WHERE " +
                            "  depart.id = usr.depart_id " +
                            " AND usr.id= operate.user_id ";
    
            String sqlorder = "  order by operate.create_time DESC ";
    
    
            if (storeId != null && storeId > 0) {
    
                sqlend += " AND operate.store_id=:storeId";
            }
            if (type != null && type > 0) {
                sqlend += " AND operate.type=:type";
            }
            if (managerId != null && managerId > 0) {
                sqlend += " AND operate.manager_id=:managerId";
            }
            if (beginTime != null) {
                sqlend += " AND operate.create_time >= :beginTime";
            }
            if (endTime != null) {
                sqlend += " AND operate.create_time <= :endTime";
            }
            if (departId != null && departId > 0) {
                sqlend += " AND depart.id = :departId";
            }
    
            if (keyword != null && !keyword.isEmpty()) {
    
                sqlend += " and (usr.real_name like '%:keyword1%' or usr.identity like '%:keyword2%') ";
            }
    
            Query query = em.createNativeQuery(sqlstart + sqlend + sqlorder, StatCardOpen.class);
            Query queryCount = em.createNativeQuery(sqlstartCount + sqlend, StatCardOpenCount.class);
    
            if (storeId != null && storeId > 0) {
                query.setParameter("storeId", storeId);
                queryCount.setParameter("storeId", storeId);
            }
            if (type != null && type > 0) {
                query.setParameter("type", type);
                queryCount.setParameter("type", type);
            }
            if (managerId != null && managerId > 0) {
                query.setParameter("managerId", managerId);
                queryCount.setParameter("managerId", managerId);
            }
            if (beginTime != null) {
                query.setParameter("beginTime", beginTime);
                queryCount.setParameter("beginTime", beginTime);
            }
            if (endTime != null) {
                query.setParameter("endTime", endTime);
                queryCount.setParameter("endTime", endTime);
            }
            if (departId != null && departId > 0) {
                query.setParameter("departId", departId);
                queryCount.setParameter("departId", departId);
            }
            if (keyword != null && !keyword.isEmpty()) {
                query.setParameter("keyword1", keyword);
                query.setParameter("keyword2", keyword);
    
                queryCount.setParameter("keyword1", keyword);
                queryCount.setParameter("keyword2", keyword);
            }
    
    
            query.setFirstResult(pageNum * pageSize);
            query.setMaxResults(pageSize);
    
            List<StatCardOpen> resultList = query.getResultList();
            DebugPrint.json("resultList", resultList);
            BigDecimal sumChangeBalance = BigDecimal.ZERO;
            BigDecimal sumChangeDonation = BigDecimal.ZERO;
            BigDecimal sumChangeDeposit = BigDecimal.ZERO;
    
            List<StatCardOpenDTO> dtoList = new ArrayList<>();
            for (StatCardOpen statCardOpen :
                    resultList) {
                if (statCardOpen != null) {
                    DebugPrint.json("statCardOpen", statCardOpen);
                    StatCardOpenDTO cardOpenDTO = new StatCardOpenDTO();
                    BeanUtils.copyProperties(statCardOpen, cardOpenDTO);
                    dtoList.add(cardOpenDTO);
                    sumChangeBalance = sumChangeBalance.add(statCardOpen.getChangeBalance());
                    sumChangeDonation = sumChangeDonation.add(statCardOpen.getChangeDonation());
                    sumChangeDeposit = sumChangeDeposit.add(statCardOpen.getChangeDeposit());
                }
    
    
            }
    
            resultMap.put("sumChangeBalance", sumChangeBalance);
            resultMap.put("sumChangeDeposit", sumChangeDeposit);
            resultMap.put("sumChangeDonation", sumChangeDonation);
            resultMap.put("list", dtoList);
            resultMap.put("page", pageNum);
            resultMap.put("pageSize", pageSize);
            resultMap.put("number", dtoList.size());
    
            List<StatCardOpenCount> countList = queryCount.getResultList();
            if (countList != null && countList.size() > 0) {
    
                StatCardOpenCount statCardOpenCount = countList.get(0);
                if (statCardOpenCount == null) {
                    resultMap.put("totle", 0);
                    resultMap.put("allChangeBalance", 0);
                    resultMap.put("allChangeDonation", 0);
                    resultMap.put("allChangeDeposit", 0);
                } else {
                    resultMap.put("totle", statCardOpenCount.getTotal());
                    resultMap.put("allChangeBalance", statCardOpenCount.getAllChangeBalance());
                    resultMap.put("allChangeDonation", statCardOpenCount.getAllChangeDonation());
                    resultMap.put("allChangeDeposit", statCardOpenCount.getAllChangeDeposit());
                }
    
            }
    
            DebugPrint.json("resultMap", resultMap);
    
            return resultMap;
        }
    
    

    相关文章

      网友评论

        本文标题:JPA EntityManager createNativeQ

        本文链接:https://www.haomeiwen.com/subject/tilqiftx.html