Criteria 三层嵌套 排序 投影 去重 查询

Criteria 复杂查询

@Override
    public Map<String, Object> blurFindOfficers(String officerName) throws Exception {

        List<Criterion> cri = new ArrayList<Criterion>();

        DetachedCriteria dOfficerCriteria = DetachedCriteria.forClass(SsOfficer.class)
                .setProjection(Property.forName("officerId"))
                .add(Restrictions.like("name", officerName, MatchMode.START));
        DetachedCriteria preCriteria = DetachedCriteria.forClass(SsClientOfficerMovement.class)
                .setProjection(Property.forName("ssClientPreOfficerMovement"))
                .add(Restrictions.isNotNull("ssClientPreOfficerMovement"));
        Criterion currenrRes = Restrictions.and(
                Restrictions.and(Restrictions.eq("status", JsonPayloadApi.CURRENT),
                        Restrictions.not(Property.forName("movementId").in(preCriteria))),
                Property.forName("ssOfficer.officerId").in(dOfficerCriteria));
        cri.add(currenrRes);

        List<Order> orderList = new ArrayList<Order>();
        Order order = Order.desc("injectedEdate");
        orderList.add(order);

        // System.out.println(lastCurrentMovementId(10));

        return universalDao.find("local.ssOfficers", SsClientOfficerMovement.class, cri, orderList, null, null, null,
                true, "ssOfficer");

        //
        // List<SsOfficer> commonOfficerList = (List<SsOfficer>)
        // universalDao.executeHqlQuery(hql, params);
        // map.put("ssOfficers", commonOfficerList);
        // return map;
    }
@Override
    public Map<String, Object> find(String key, Class<?> clz, List<Criterion> criterions, List<Order> orders,
            Integer pageSize, Integer currentPage, Map<String, String> aliasMap, boolean isDistinct, String projection)
                    throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();
        Map<String, Object> metaMap = null;
        Criteria criteria = sessionFactory.getCurrentSession().createCriteria(clz);

        if (aliasMap != null) {
            Iterator<String> alIt = aliasMap.keySet().iterator();
            while (alIt.hasNext()) {
                String propertyname = alIt.next();
                String alias = aliasMap.get(propertyname);
                criteria.createAlias(propertyname, alias);// 设置别名
            }
        }
        // 查询过滤
        if (criterions != null) {
            for (int i = 0; i < criterions.size(); i++) {
                criteria.add(criterions.get(i));

            }
        }
        // 排序
        if (orders != null) {
            for (int i = 0; i < orders.size(); i++) {
                criteria.addOrder((orders.get(i)));
            }
        }
        // 分页
        if (pageSize != null && currentPage != null) {
            Criteria countCriteria = sessionFactory.getCurrentSession().createCriteria(clz);
            if (criterions != null) {
                for (int i = 0; i < criterions.size(); i++) {

                    countCriteria.add(criterions.get(i));
                }
            }
            if (aliasMap != null) {
                Iterator<String> alIt = aliasMap.keySet().iterator();
                while (alIt.hasNext()) {
                    String propertyname = alIt.next();
                    String alias = aliasMap.get(propertyname);
                    countCriteria.createAlias(propertyname, alias);// 设置别名
                }
            }
            // 得到记录的总条数 一次查询
            int totalCount = ((Number) countCriteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
            // 得到记录的总页数
            int totalPages = (totalCount % pageSize == 0) ? (totalCount / pageSize) : (totalCount / pageSize) + 1;

            criteria.setFirstResult((currentPage - 1) * pageSize);
            criteria.setMaxResults(pageSize);

            metaMap = new HashMap<String, Object>();
            metaMap.put("currentPage", currentPage);
            metaMap.put("perPage", pageSize);
            metaMap.put("totalPages", totalPages);
            metaMap.put("totalCount", totalCount);
            map.put(JsonPayloadApi.META, metaMap);

        }
        if (projection != null && isDistinct) {
            // criteria.setProjection(Property.forName(projection));

            // 一步到位
            criteria.setProjection(Projections.distinct(Property.forName(projection)));
        }
        if (isDistinct) {
            // criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        }

        // 得到列表项的查询
        List<?> results = (List<?>) criteria.list();
        map.put(key, results);

        return map;
    }

原生sql 连接 投影 聚集分组 排序 查询

SELECT c.certificateNo,s.companyName,m.shareClassType,sum(m.numberOfShare), m.amountPerShare*sum(m.numberOfShare),c.registrationId,c.clientId FROM sjerp_sec_2315ag.ss_client_share_certificate_movement m left join sjerp_sec_2315ag.ss_client_share_certificate c on m.mainId=c.certificateId left join sjerp_sec_2315ag.ss_corporate_shareholder s on c.registrationId=s.registerationId where m.shareClassType='eeeeeeeeee' and c.registrationId='hzhcor1' and c.clientId=2315 and m.currency='eeeeeeeeee' group by mainId having sum(numberOfShare)>0 order by c.certificateNo asc;