2016-11-14 51 views
1

你能幫我解決這個問題嗎?我試圖按日期排序條件查詢的結果,但我沒有得到我需要的結果。我以字符串格式保存日期,如何使用條件按日期排序條件ORDER BY日期不工作?

我正在使用的代碼是:

@Override 
public List<Program> getListProgram() { 
    Session session=sessionFactory.openSession(); 
    Criteria criteria=session.createCriteria(Program.class); 
    criteria.addOrder(Order.asc("createdDate")); 
    List<Program> programs=(List<Program>)criteria.list(); 
    return programs; 
} 

結果是:

01/02/2009 
03/01/2009 
04/06/2009 
05/03/2009 
06/12/2008 
07/02/2009 

結果應該是:

06/12/2008 
03/01/2009 
01/02/2009 
07/02/2009 

I N以上述格式選擇日期。

非常感謝您的幫助。

+0

爲什麼你在字符串中使用的日期,而不是一個適當的日期類型列? – Tom

+0

@Tom它發生意外我怎麼排序.Pleas幫助我湯姆? –

回答

2

在標準上執行list方法之前,您必須撥打criteria.addOrder(Order.asc("createdDate"));

@Override 
public List<Program> getListProgram() { 
    Session session=sessionFactory.openSession(); 
    Criteria criteria=session.createCriteria(Program.class); 
    criteria.addOrder(Order.asc("createdDate")); 
    List<Program> programs=(List<Program>)criteria.list(); 
    return programs; 
} 

編輯

在你的情況,如果你想通過字符串日期排序,正如我在評論mentionned,這個答案是不正確的,你可以得到(可旋轉creationDate到日期類型是最好的!當然)。

你可以嘗試像一些代碼:

static final String DF = "DD/MM/YYYY"; 
static final SimpleDateFormat SDF = new SimpleDateFormat(DF); 

@Override 
public List<Program> getListProgram() { 
    Session session=sessionFactory.openSession(); 
    Criteria criteria=session.createCriteria(Program.class); 
    List<Program> =(List<Program>)criteria.list(); 
    boolean asc = true; 
    programs.sort((a, b) -> { 
     int comparison = 0; 
     try { 
      comparison = SDF.parse(a.getCreatedDate()).compareTo(SDF.parse(b.getCreatedDate())); 
     } catch (ParseException e) { 
      // handle it!! 
     } 
     return asc ? comparison : (0-comparison); 
    }); 
    return programs; 
} 

EDIT 2

如果你想避免使用lambda表達式,請嘗試使用這個:

Collections.sort(programs, new Comparator<Main>() { 
     @Override 
     public int compare(Program a, Program b) { 
      int comparison = 0; 
     try { 
      comparison = SDF.parse(a.getCreatedDate()).compareTo(SDF.parse(b.getCreatedDate())); 
     } catch (ParseException e) { 
      // handle it!! 
     } 
     return asc ? comparison : (0-comparison); 
     } 
    }); 
+0

我更新了我的問題,實際上我是以字符串格式保存創建的日期我該如何按日期排序。能否解答問題..... –

+0

您使用的是什麼sgbd? –

+0

其實我在腦海中有一個解決方案,但它不合適 –

0

標準傳遞到休眠並被翻譯成某種語言。它們出現在selectwhere子句之後,因此它們在執行查詢之前必須設置所有限制。雖然您沒有看到它,但在調用criteria.list()時會生成並執行查詢。

嘗試以下操作:

@Override 
public List<Program> getListProgram() { 
    Session session=sessionFactory.openSession(); 
    Criteria criteria=session.createCriteria(Program.class); 
    criteria.addOrder(Order.asc("createdDate")); 
    List<Program> programs=(List<Program>)criteria.list(); 
    return programs; 
} 
+0

我更新了我的問題,我用String保存了創建的日期格式我怎樣才能按日期排序 –

+0

@SymonKt日期/值正確地排序爲一個字符串。 – Tom

0

首先,日期應存放日期,不是字符串。如果你正在使用遺留系統,可能無法改變這一點,但我認爲這可能會讓你的生活更容易咬人子彈和重構。

作爲一個字符串,排序功能工作,因爲05到來之前06

我建議使用註釋或映射,如概括in this question,將字符串轉換爲日期的POJO,使其在您的應用程序中至少有某處的正確類型。

public class StringToDateConverter implements AttributeConverter<Date, String> { 
    String convertToDatabaseColumn(Date attribute) { /* Conversion code */ } 

    Date convertToEntityAttribute(String dbData) { /* Conversion code */ } 
} 

public class MyPojo { 
    @javax.persistence.Convert(converter = StringToDateConverter.class) 
    public Date getCreateDate() { 
    } 
}