spring-data-jpa 多条件查询 学习记录

          spring-data-jpa 是对数据库访问的简化的封装,可以帮助我们更加方便的实现对数据库的各种操作。Spring Data JPA 规范方法的名字,根据符合规范的名字来确定方法需要实现什么样的逻辑,无需要我们过多关注sql等。一般情况下,对于单表操作非常方便,而涉及到多条件或者多表联查时相对复杂一些。这里简单记录一下jpa多条件查询的相关api。

       多条件分页查询:其中User为查询条件对象

public Page<User> findByPage(final User user, int page, int pageSize) throws Exception {
		Sort sort = new Sort(Direction.DESC, "registerTime");
		PageRequest pageRequest =  new PageRequest(page, pageSize, sort);
		
		return userDao.findAll(new Specification<User>(){
			@Override
			public Predicate toPredicate(Root<User> root,
					CriteriaQuery<?> query, CriteriaBuilder builder) {
				List<Predicate> predicates = new ArrayList<Predicate>();
				if(null != user.getUserType()){
					predicates.add(builder.equal(root.get("userType"), user.getUserType()));
				}
				if(null != user.getStatus()){
					predicates.add(builder.equal(root.get("status"), user.getStatus()));
				}
				query.where(predicates.toArray(new Predicate[predicates.size()]));
				return null;
			}
		}, pageRequest);
	}
以上代码代表:根据userType及status分页查询User表符合条件的记录。userType,status是User的属性字段


   多表联查: Question, Grade, Subject

public Page<Question> questionList(final String keyword,final String knowledge,final String type,final String itemBankId,final String gradeId,final String subjectId,Pageable pageable) {
    Page<Question> question = questionDao.findAll(new Specification<Question>() {
        @Override
        public Predicate toPredicate(Root<Question> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            Predicate predicate = cb.conjunction();
            List<Expression<Boolean>> expressions = predicate.getExpressions();
            if (StringUtils.isNotBlank(keyword)) {
                expressions.add(cb.like(root.<String>get("keyword"), "%"+keyword+"%"));         
            }
            if (StringUtils.isNotBlank(knowledge)) {
                expressions.add(cb.like(root.<String>get("knowledge"), "%"+knowledge +"%"));    
            }
            if (NumberUtils.isDigits(type)) {
                expressions.add(cb.equal(root.<String>get("type"), type));   
            }
            if(StringUtils.isNotBlank(itemBankId)) {
                expressions.add(cb.equal(root.<String>get("puuid"), itemBankId));        
            }
            if(NumberUtils.isDigits(gradeId)) {
                expressions.add(cb.equal(root.<Grade>get("grade").<Long>get("id"), NumberUtils.toLong(gradeId)));       
            }
            if(NumberUtils.isDigits(subjectId)) {
                expressions.add(cb.equal(root.<Subject>get("subject").<Long>get("id"), NumberUtils.toLong(subjectId)));   
            }
            expressions.add(cb.equal(root.<Long>get("deleteBy"), 0));
            return predicate;
        }
    },pageable);
    return question;
}

此操作为多表联查: root.<Subject>get("subject") .<Long>get("id")表示取Question的属性subject对应的Subject对象的id字段的值,类似于sql中的join操作。

       

    另记录一下利用游标查询记录总数:

public int findPageByQuery(final String sql,
            final Object[] parameters) {
        //em ==> EntityManager
        Session session = (Session) em.getDelegate();
        Query query = session.createQuery(sql);
        if (parameters != null) {
            for (int i = 0; i < parameters.length; i++) {
                query.setParameter(i, parameters[i]);
            }
        }
        //获取游标
        ScrollableResults sr = query.scroll();
        sr.last();
        int totalCount = sr.getRowNumber();
        return totalCount + 1;
    }


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值