zoukankan      html  css  js  c++  java
  • spring data jpa分页5种方法

    7.12.12	分页
    本地sql查询
    注意表名啥的都用数据库中的名称, 适用于特定数据库的查询
    public interface UserRepository extends JpaRepository<User, Long> {
    
    	@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1"
    , countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1"
    , nativeQuery = true)
    	Page<User> findByLastname(String lastname, Pageable pageable);
    
    	@Query(value = "SELECT u  FROM Users u WHERE u.username like %:username%")
    	List<User> findByName(@Param("username") String username);
    }
    
    使用entityManager
    适用于动态sql查询
    @Service
    @Transactional
    public class IncomeService{
    
        /**
         * 实体管理对象
         */
        @PersistenceContext
        EntityManager entityManager;
    
        public Page<IncomeDaily> findIncomeDailysByPage(PageParam pageParam, String cpId, String appId, Date start, Date end, String sp) {
            StringBuilder countSelectSql = new StringBuilder();
            countSelectSql.append("select count(*) from IncomeDaily po where 1=1 ");
    
            StringBuilder selectSql = new StringBuilder();
            selectSql.append("from IncomeDaily po where 1=1 ");
    
            Map<String,Object> params = new HashMap<>();
            StringBuilder whereSql = new StringBuilder();
            if(StringUtils.isNotBlank(cpId)){
                whereSql.append(" and cpId=:cpId ");
                params.put("cpId",cpId);
            }
            if(StringUtils.isNotBlank(appId)){
                whereSql.append(" and appId=:appId ");
                params.put("appId",appId);
            }
            if(StringUtils.isNotBlank(sp)){
                whereSql.append(" and sp=:sp ");
                params.put("sp",sp);
            }
            if (start == null)
            {
                start = DateUtil.getStartOfDate(new Date());
            }
            whereSql.append(" and po.bizDate >= :startTime");
            params.put("startTime", start);
    
            if (end != null)
            {
                whereSql.append(" and po.bizDate <= :endTime");
                params.put("endTime", end);
            }
    
            String countSql = new StringBuilder().append(countSelectSql).append(whereSql).toString();
            Query countQuery = this.entityManager.createQuery(countSql,Long.class);
            this.setParameters(countQuery,params);
            Long count = (Long) countQuery.getSingleResult();
    
            String querySql = new StringBuilder().append(selectSql).append(whereSql).toString();
            Query query = this.entityManager.createQuery(querySql,IncomeDaily.class);
            this.setParameters(query,params);
            if(pageParam != null){ //分页
                query.setFirstResult(pageParam.getStart());
                query.setMaxResults(pageParam.getLength());
            }
    
            List<IncomeDaily> incomeDailyList = query.getResultList();
          if(pageParam != null) { //分页
                Pageable pageable = new PageRequest(pageParam.getPage(), pageParam.getLength());
                Page<IncomeDaily> incomeDailyPage = new PageImpl<IncomeDaily>(incomeDailyList, pageable, count);
                return incomeDailyPage;
            }else{ //不分页
                return new PageImpl<IncomeDaily>(incomeDailyList);
            }
        }
    
        /**
         * 给hql参数设置值
         * @param query 查询
         * @param params 参数
         */
        private void setParameters(Query query,Map<String,Object> params){
            for(Map.Entry<String,Object> entry:params.entrySet()){
                query.setParameter(entry.getKey(),entry.getValue());
            }
        }
    }
    
    
    
    Query注解,hql语句
    适用于查询指定条件的数据
    @Query(value = "select b.roomUid from RoomBoard b where b.userId=:userId and b.lastBoard=true order by  b.createTime desc")
    Page<String> findRoomUidsByUserIdPageable(@Param("userId") long userId, Pageable pageable);
    
    Pageable pageable = new PageRequest(pageNumber,pageSize);
    Page<String> page = this.roomBoardRepository.findRoomUidsByUserIdPageable(userId,pageable);
    List<String> roomUids = page.getContent();
    
    可以自定义整个实体(Page<User>),也可以查询某几个字段(Page<Object[]>),和原生sql几乎一样灵活。
    
    jpa已经实现的分页接口
    适用于简单的分页查询
    public interface PagingAndSortingRepository<T, ID extends Serializable>
      extends CrudRepository<T, ID> {
    
      Iterable<T> findAll(Sort sort);
    
      Page<T> findAll(Pageable pageable);
    }
    
    Accessing the second page of User by a page size of 20 you could simply do something like this:
    
    PagingAndSortingRepository<User, Long> repository = // … get access to a bean
    Page<User> users = repository.findAll(new PageRequest(1, 20));
    
    User findFirstByOrderByLastnameAsc();
    
    User findTopByOrderByAgeDesc();
    
    Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
    
    Slice<User> findTop3ByLastname(String lastname, Pageable pageable);
    
    List<User> findFirst10ByLastname(String lastname, Sort sort);
    
    List<User> findTop10ByLastname(String lastname, Pageable pageable);
    
    
     //service
     Sort sort = new Sort(Sort.Direction.DESC,"createTime"); //创建时间降序排序
     Pageable pageable = new PageRequest(pageNumber,pageSize,sort);
     this.depositRecordRepository.findAllByUserIdIn(userIds,pageable);
    
    //repository
    Page<DepositRecord> findAllByUserIdIn(List<Long> userIds,Pageable pageable);
    
    扩充findAll
    适用于动态sql查询
    public interface UserRepository extends JpaRepository<User, Long> {
        Page<User> findAll(Specification<User> spec, Pageable pageable);
    } 
    
    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        public Page<User> getUsersPage(PageParam pageParam, String nickName) {
            //规格定义
            Specification<User> specification = new Specification<User>() {
    
                /**
                 * 构造断言
                 * @param root 实体对象引用
                 * @param query 规则查询对象
                 * @param cb 规则构建对象
                 * @return 断言
                 */
                @Override
                public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                    List<Predicate> predicates = new ArrayList<>(); //所有的断言
                    if(StringUtils.isNotBlank(nickName)){ //添加断言
                        Predicate likeNickName = cb.like(root.get("nickName").as(String.class),nickName+"%");
                        predicates.add(likeNickName);
                    }
                    return cb.and(predicates.toArray(new Predicate[0]));
                }
            };
            //分页信息
            Pageable pageable = new PageRequest(pageParam.getPage()-1,pageParam.getLimit()); 
    //页码:前端从1开始,jpa从0开始,做个转换
            //查询
            return this.userRepository.findAll(specification,pageable);
        }
    }
    
    
  • 相关阅读:
    VisualSVN-Server windows 版安装时报错 "Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details."
    Pytest 单元测试框架之初始化和清除环境
    Pytest 单元测试框架入门
    Python(email 邮件收发)
    Python(minidom 模块)
    Python(csv 模块)
    禅道简介
    2020年最好的WooCommerce主题
    Shopify网上开店教程(2020版)
    WooCommerce VS Magento 2020:哪个跨境电商自建站软件更好?
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/9710153.html
Copyright © 2011-2022 走看看