2011-03-05 36 views
2
public List<Movie> findRange(int[] range) { 
    CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
    cq.select(cq.from(Movie.class)); 
    Query q = em.createQuery(cq); 
    q.setMaxResults(range[1] - range[0]); 
    q.setFirstResult(range[0]); 
    List<Movie> list1 = q.getResultList(); 
    Collections.sort(list1, new Comparator(){ 
      public int compare (Object o1, Object o2){ 
       Movie p1 = (Movie)o1; 
       Movie p2 = (Movie)o2; 
       return p2.getDate().compareTo(p1.getDate()); 
      } 
     }); 
    return list1; 
} 

查詢結果排序因爲它是現在整理的作品,但只有在批,
(批量= 4級的電影)首先一個=最後輸入;最後一個= fisrt輸入。
但只能與批次中的那些進行比較,而不是根據需要全部進行比較。如何通過他們的日期(JPA,Java集合)

非常感謝您的幫助,您可以提供
問候
伊格納西奧

回答

5

你或許應該在條件查詢中定義了訂單和查詢已經被執行後沒有結果進行排序。否則,您最終只會對結果的一部分進行排序。

您可以使用CriteriaQuery.orderBy(Order ...)爲查詢分配排序順序。按照表達式的順序可以使用CriteriaBuilder使用asc(Expression)(升序)或desc(Expression)(降序)創建。

下可能會或可能無法正常工作:

public List<Movie> findRange(int[] range) { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Movie> cq = cb.createQuery(Movie.class); 
    Root<Movie> movie = cq.from(Movie.class); 
    cq.select(movie); 
    cq.order(cb.asc(movie.get(Movie_.getDate())); 


    ... 

} 
+0

非常感謝你,但它不工作,那爲什麼你已經知道它可能無法正常工作?我可以改變什麼來使其工作? – 2011-03-06 05:06:12

+1

嗯,我猜想它可能不起作用,因爲我沒有測試它。我認爲無論是編譯器還是JPA引擎都可能記錄一些錯誤信息。 JEE 6教程包含了一些關於在JPA 2中排序的結果:http://download.oracle.com/javaee/6/tutorial/doc/gjivm.html#gjiwo – 2011-03-06 05:18:43

+0

它的工作原理!非常感謝你只需要一個正確的設置,只是一個問題。爲什麼cq.order(cb.asc(movie.get(Movie_.getDate()))和以前不一樣cq.orderBy(cb.asc(movies.get(「date」)))?? – 2011-03-06 13:50:34