使用JPA标准延迟加载

时间:2014-05-14 15:14:54

标签: primefaces jpa-2.0 lazy-loading criteria-api

我使用JPA Criterea实现了使用延迟加载primefaces数据表的通用解决方案。 但是,每当我们处理多个联接时,我仍然对这个实现的解决方案有一些疑问(例如,除了原始类型属性之外,还有与其他实体(如Account,Address,Department .....)有关系的实体用户:String用户名,生日日期等等。

我测试了这个解决方案但是在加载大量数据时遇到了一些延迟(但是解决方案只能加载来自数据表的PageSize指定的有限行数),所以:

如何提高此解决方案的性能? 如何确保加载数据的数量是Pagesize中指定的数据? 你可以检查count()方法并告诉它是否计算结果行数而不加载所有数据?

最重要的是如何使用此解决方案以使用来自搜索表单的过滤器(我的意思是如何使用这种sae泛型方法并从具有多个搜索字段的搜索表单中提供搜索标准)?

我需要你回答上述问题,特别是最后一个问题。 这是代码:

public <T extends Object> List<T> search(Class<T> type, int first, int pageSize, String  sortField, SortOrder sortOrder, Map<String, String> filters){
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<T> q = cb.createQuery(type);  
        Root<T> root=q.from(type);
        q.select(root);

        //Sorting
        if (sortField != null && !sortField.isEmpty()) {  
            String[] sortingField = sortField.split("\\.", 2);
            Path path = sortingField.length == 1 ? root.get(sortingField[0]): root.join(sortingField[0]).get(sortingField[1]);
             if (sortOrder.equals(SortOrder.ASCENDING)) {  
                    q.orderBy(cb.asc(path));  
                } else if (sortOrder.equals(SortOrder.DESCENDING)) {  
                    q.orderBy(cb.desc(path));  
                }
        }  

        // Filtering
        Predicate filterCondition = cb.conjunction();
        String wildCard = "%";

        for (Map.Entry<String, String> filter : filters.entrySet()) {
            String[] filterField = filter.getKey().split("\\.", 2);
            Path path = filterField.length == 1 ? root.get(filterField[0]): root.join(filterField[0]).get(filterField[1]);
            filterCondition = cb.and(filterCondition, filter.getValue().matches("[0-9]+") 
                    ? cb.equal(path, Long.valueOf(filter.getValue()))
                    : cb.like(path, wildCard + filter.getValue() + wildCard));   
        }q.where(filterCondition);

        //Pagination
        TypedQuery<T> s = entityManager.createQuery(q);
        if (pageSize >= 0){
            s.setMaxResults(pageSize);
        }
        if (first >= 0){
            s.setFirstResult(first);
        }
        log.info("\n\n\n");
        log.info("XXXXXXXXXxX");
        log.info("=> CommonRepository - Total number of rows returned: ");
        log.info("XXXXXXXXXXX");
        log.info("\n\n\n");
        return s.getResultList();
 }


public <T extends Object> int count(Class<T> type, Map<String, String> filters){
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Long> cq = cb.createQuery(Long.class);
        Root<T> root=cq.from(type);

        // Filtering
        Predicate filterCondition = cb.conjunction();
        String wildCard = "%";

        for (Map.Entry<String, String> filter : filters.entrySet()) {

            String[] filterField = filter.getKey().split("\\.", 2);

            Path path = filterField.length == 1 ? root.get(filterField[0]): root.join(filterField[0]).get(filterField[1]);

            filterCondition = cb.and(filterCondition, filter.getValue().matches("[0-9]+") 
                    ? cb.equal(path, Long.valueOf(filter.getValue()))
                    : cb.like(path, wildCard + filter.getValue() + wildCard));   
        }cq.where(filterCondition);
        cq.select(cb.count(root));
        return entityManager.createQuery(cq).getSingleResult().intValue();
}

0 个答案:

没有答案