2015-01-10 55 views
0

我有工作了以下方法:分頁休眠JPA:ORDERBY + setFirstResult + setMaxResult

public List<Course> filterOn(String course, String university, List<String> providers, String sortOn, int page) { 
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 

    List<Predicate> predicates = new ArrayList<Predicate>(); 
    CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(); 
    Root r = criteriaQuery.from(Course.class); 
    criteriaQuery.select(r); 

    predicates.add(criteriaBuilder.like(r.get("name"), "%" + course + "%")); 
    predicates.add(criteriaBuilder.like(r.get("university").get("name"), "%" + university + "%")); 

    predicates.add(criteriaBuilder.or(criteriaBuilder.like(r.get("type"), providers.get(0)), 
             criteriaBuilder.like(r.get("type"), providers.get(1)), 
             criteriaBuilder.like(r.get("type"), providers.get(2)), 
             criteriaBuilder.like(r.get("type"), providers.get(3)))); 

    if (predicates != null && !predicates.isEmpty()) { 
     criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))); 
    } 

    if (sortOn.equals("ranks")) { 
     criteriaQuery.orderBy(criteriaBuilder.asc(r.get("averageScoreLastSemester"))); 
    } else if (sortOn.equals("name")) { 
     criteriaQuery.orderBy(criteriaBuilder.desc(r.get("name"))); 
    } 

    final TypedQuery query = entityManager.createQuery(criteriaQuery); 

    query.setFirstResult(page * COURSES_PER_PAGE); 
    query.setMaxResults(COURSES_PER_PAGE); 

    return query.getResultList(); 
} 

的問題是,它只是訂單當前頁面。我希望它根據數據庫中所有匹配的記錄進行排序,然後返回當前頁面。我怎樣才能做到這一點?

從日誌:

select 
     course0_.id as id1_14_, 
     course0_.created as created2_14_, 
     course0_.updated as updated3_14_, 
     course0_.averageScoreLastSemester as averageS4_14_, 
     course0_.avgAverageArray as avgAvera5_14_, 
     course0_.avgStructureArray as avgStruc6_14_, 
     course0_.avgTeachersArray as avgTeach7_14_, 
     course0_.avgWorkloadArray as avgWorkl8_14_, 
     course0_.code as code9_14_, 
     course0_.courseLink as courseL10_14_, 
     course0_.credits as credits11_14_, 
     course0_.level as level12_14_, 
     course0_.name as name13_14_, 
     course0_.numberOfAssignments as numberO14_14_, 
     course0_.numberOfExams as numberO15_14_, 
     course0_.numberOfProjects as numberO16_14_, 
     course0_.pace as pace17_14_, 
     course0_.rankCountArray as rankCou18_14_, 
     course0_.requirementsLink as require19_14_, 
     course0_.semester as semeste20_14_, 
     course0_.teacherName as teacher21_14_, 
     course0_.type as type22_14_, 
     course0_.university_id as univers23_14_ 
    from 
     courses course0_ cross 
    join 
     universities university1_ 
    where 
     course0_.university_id=university1_.id 
     and (
      course0_.name like ? 
     ) 
     and (
      university1_.name like ? 
     ) 
     and (
      course0_.type like ? 
      or course0_.type like ? 
      or course0_.type like ? 
      or course0_.type like ? 
     ) 
    order by 
     course0_.name desc limit ? 
Hibernate: 
    select 
     course0_.id as id1_14_, 
     course0_.created as created2_14_, 
     course0_.updated as updated3_14_, 
     course0_.averageScoreLastSemester as averageS4_14_, 
     course0_.avgAverageArray as avgAvera5_14_, 
     course0_.avgStructureArray as avgStruc6_14_, 
     course0_.avgTeachersArray as avgTeach7_14_, 
     course0_.avgWorkloadArray as avgWorkl8_14_, 
     course0_.code as code9_14_, 
     course0_.courseLink as courseL10_14_, 
     course0_.credits as credits11_14_, 
     course0_.level as level12_14_, 
     course0_.name as name13_14_, 
     course0_.numberOfAssignments as numberO14_14_, 
     course0_.numberOfExams as numberO15_14_, 
     course0_.numberOfProjects as numberO16_14_, 
     course0_.pace as pace17_14_, 
     course0_.rankCountArray as rankCou18_14_, 
     course0_.requirementsLink as require19_14_, 
     course0_.semester as semeste20_14_, 
     course0_.teacherName as teacher21_14_, 
     course0_.type as type22_14_, 
     course0_.university_id as univers23_14_ 
    from 
     courses course0_ cross 
    join 
     universities university1_ 
    where 
     course0_.university_id=university1_.id 
     and (
      course0_.name like ? 
     ) 
     and (
      university1_.name like ? 
     ) 
     and (
      course0_.type like ? 
      or course0_.type like ? 
      or course0_.type like ? 
      or course0_.type like ? 
     ) 
    order by 
     course0_.name desc limit ? 

我猜的最後一行是很重要的,我讀的地方,它應該首先排序的所有記錄,然後限制他們。所以這似乎是正確的?

我使用hibernate方言org.hibernate.dialect.MySQL5Dialect和使用com.mysql.jdbc.Driver的數據源。

謝謝。

+0

數據庫中的所有記錄?但你正在使用限制(與喜歡)。我沒有看到任何錯誤。 –

+0

但是查詢很奇怪(如結構),不是通過diferrents實體(課程*和*大學)的常見搜索。 –

+0

我的意思是我想獲得與名稱,大學,提供者等屬性相匹配的所有課程。這工作。但是,我希望通過課程成績或名稱來訂購。然後返回一頁。這不起作用。它返回一個頁面,但它只在該頁面內排序,而不是與我想要的所有匹配進行比較。 – nilsi

回答

0

也許是視圖技術的問題?您是否運行Sysout resultList以確認排序順序問題來自JPA?當你改變到第二頁時,過濾器仍然在那裏?