2016-11-14 7 views
1

Можете ли вы мне помочь в решении этой проблемы. Я пытаюсь упорядочить результаты запроса критериев по дате, но я не получаю результаты, которые мне нужны. Я сохранил дату в формате String, как я могу упорядочить по дате, используя критерииКритерии 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 п чтобы выбрать дату в формате выше.

Ваша помощь очень ценится.

+0

Почему вы используете Даты в строку, а не собственно столбец Дата тип? – Tom

+0

@ То, что случилось случайно, как я могу сортировать. Помогите мне Том? –

ответ

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; 
} 

EDIT

В вашем случае, если вы хотите сделать заказ по датам строки, как я упоминался в комментариях, этот ответ не правильный, вы можете получить (может быть, переворачивается 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

Если вы хотите, чтобы избежать использования лямбды, попробуйте использовать вместо этого: пропускаются

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

Я обновил свой вопрос на самом деле, я сохраняю созданную дату в формате String, как я могу упорядочить по дате. Можете ли вы задать вопрос ..... –

+0

какой sgbd вы используете? –

+0

На самом деле у меня есть решение в моем сознании, но оно не подходит –

0

Критерии в Hibernate и переведены на определенный язык. Они появляются после предложения where в select, поэтому все ограничения должны быть установлены перед выполнением запроса. Хотя вы этого не видите, есть запрос, сгенерированный и выполняемый при вызове 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() { 
    } 
}