2013-02-23 40 views
0

我有一些表名稱作爲我的方法的I/P參數。我需要獲取creationDate(日期),爲每個表計數並將其放入合併列表中)如何根據日期對Java中的列表<日期,字符串>

然後根據creationDate對列表進行排序。

這裏是方法:

public String getData(List tablename){ 
    Lifecycle.beginCall(); 
    EntityManager mgr = (EntityManager) Component.getInstance("entityManager"); 
    List data = new ArrayList(); 
    if (!tablename.isEmpty()) 
    { 
     Iterator itr = tablename.iterator(); 
     while(itr.hasNext()) 
     { 
      String element = itr.next().toString(); 
      Query q = mgr.createQuery("select to_date(s.creationDate), count(s)" + 
             " from " + element + " s" + 
             " group by to_date(creationDate)" + 
             " order by to_date(creationDate)"); 
      List dataTemp = q.getResultList(); 

      data.addAll(dataTemp); 

     } 
    } 
} 

現在我有表數據,例如:這裏

({["Jan 3, 2013 12:00:00 AM",10], 
    ["Feb 3, 2013 12:00:00 AM",10], 
    ["Jan 1, 2013 12:00:00 AM",10], 
    ..........}) 

挑戰賽,我想這個清單根據日期

+1

您是否試過'Collections.sort'? – 2013-02-23 14:41:52

+0

你可以使用命令通過sql命令。看到這個:http://stackoverflow.com/questions/3616224/jpql-order-by-clause-with-parameter – Hassan 2013-02-23 14:46:19

+0

與您的問題無關,但重要的是:使用參數化查詢,以防止SQL注入 – Joost 2013-02-23 15:06:56

回答

1

必須進行排序看看Collections.sort()。你所需要做的就是編寫一個實現Comparator<Date>的類,並將其與你的列表一起提供以進行排序。

甚至更​​好,因爲日期已經是可比較的,您可以撥打Collections.sort(data)並按升序排序。

編輯:在仔細檢查你的列表(data)不包含Date對象時,它實際上是一個List,每個元素都是大小爲2的對象數組 - 第一個數組中的第一個項是表的創建日期,第二個是行數。所以你需要這樣排序:

Collections.sort(data, new Comparator<Object> { 
    @Override 
    public int compare(Object o1, Object o2) { 
     Object[] a1 = (Object[]) o1; 
     Object[] a2 = (Object[]) o2; 
     Date d1 = (Date) a1[0]; 
     Date d2 = (Date) a2[0]; 
     return d1.compareTo(d2); 
    } 
}); 
+0

感謝您的快速響應。 我使用DWR功能(class.method(表名的列表)) 我已經加入Collections.sort(數據),以我的方法調用JS上述方法並運行服務器 我得到這個錯誤 08:50 :55,989 WARN [org.directwebremoting.dwrp.BaseCallMarshaller](http-localhost-127.0.0.1-8080-1)--Erroring:batchId [0] message [java.lang.ClassCastException:[Ljava.lang.Object;不能轉換爲java.lang.Comparable] – 2013-02-23 14:53:41

+0

你使用sort()和比較器嗎? – radai 2013-02-23 14:57:28

+0

對不起,我是初學者到Java 如何/在哪裏我需要調用/添加上面的代碼片段到我現有的方法 – 2013-02-23 15:23:07

0

最簡單的方法是在數據庫級別進行排序。

查詢更改爲

 Query q = mgr.createQuery("select to_date(s.creationDate), count(s)" + 
            " from " + element + " s" + 
            " group by to_date(creationDate)" + 
            " order by creationDate asc"); 
+0

此查詢多次使用不同的表名稱值運行。所有結果都放在同一個列表中。除非將所有查詢與UNION組合在一起,否則無法在SQL中執行此操作。 – 2013-02-23 14:57:00

0

依我之見,你從多個表中選擇。您可以使用UNION組成一個SQL查詢來選擇一個查詢的所有記錄。這是非常相似的查詢:SQL Query - Using Order By in UNION

+0

我使用Hibernate Annotations的概念,當我這樣做使用UNION和它不工作 – 2013-02-24 22:28:02

相關問題