轉自:https://blog.csdn.net/lsk12162012/article/details/50442792 java
spring-data-jpa 是對數據庫訪問的簡化的封裝,能夠幫助咱們更加方便的實現對數據庫的各類操做。Spring Data JPA 規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯,無須要咱們過多關注sql等。通常狀況下,對於單表操做很是方便,而涉及到多條件或者多表聯查時相對複雜一些。這裏簡單記錄一下jpa多條件查詢的相關api。git
多條件分頁查詢:其中User爲查詢條件對象spring
- 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的屬性字段sql
多表聯查: 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操做。express
另記錄一下利用遊標查詢記錄總數:api
- public int findPageByQuery(final String sql,
- final Object[] parameters) {
-
- 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;
- }