【问题标题】:Criteria ORDER BY date not working?条件 ORDER BY 日期不起作用?
【发布时间】:2017-03-28 03:02:39
【问题描述】:

你能帮我解决这个问题吗?我正在尝试按日期排序条件查询的结果,但没有得到我需要的结果。我以字符串格式保存日期,如何使用条件按日期排序

我使用的代码是:

@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

我需要按照上面的格式选择日期。

非常感谢您的帮助。

【问题讨论】:

  • 为什么在字符串中使用日期而不是正确的日期类型列?
  • @Tom 发生意外我该如何排序。请帮帮我 Tom?

标签: java hibernate hibernate-criteria


【解决方案1】:

这是如何实现的

 private List<Users> findUsers(boolean all, int maxResults, int firstResult, SchoolData data) {
    EntityManager em = getEntityManager(data.getExternalId());
    try {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery cq = cb.createQuery();
        Root<Users> from = cq.from(Users.class);
        cq.orderBy(cb.desc(from.get("dateCreated")));
        cq.select(cq.from(Users.class));
        Query q = em.createQuery(cq);
        if (!all) {
            q.setMaxResults(firstResult);
            q.setFirstResult(maxResults);
        }
        return q.getResultList();
    } finally {
        em.close();
    }
}

【讨论】:

    【解决方案2】:

    首先,日期应该存储为日期,而不是字符串。如果您使用的是遗留系统,则可能无法更改这一点,但我认为这可能会让您更轻松地咬紧牙关和重构。

    作为一个字符串,排序函数是有效的,因为 05 在 06 之前。

    我建议使用注释或映射,如 in this question 所述,将您的字符串转换为 pojo 中的日期,以便它在您的应用程序中至少 somewhere 是正确的类型。

    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() {
      }
    }
    

    【讨论】:

      【解决方案3】:

      您必须在根据条件执行 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;
      }
      

      编辑

      在你的情况下,如果你想按字符串日期排序,正如我在 cmets 中提到的那样,这个答案不是你能得到的正确答案(可能将 creationDate 转换为 Date 类型是最好的!当然)。

      你可以试试这样的代码:

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

      编辑 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);
              }
          });
      

      【讨论】:

      • 我更新了我的问题实际上我正在以字符串格式保存创建的日期我如何按日期排序。你能理解你的问题.....
      • 你用的是什么sgbd?
      • 其实我心里有个解决办法,但是不合适
      • 你能帮我吗我已经在那一栏中输入了如何处理排序。我真的很挣扎
      • 你可以查一下,我用java 8写的小块代码,如果你不使用java 8,请告诉我们。
      【解决方案4】:

      条件被传递给 Hibernate 并被翻译成特定的语言。它们出现在select 中的where 子句之后,因此必须在执行查询之前设置它们的所有限制。虽然看不到,但调用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;
      }
      

      【讨论】:

      • 我更新了我的问题,我正在以字符串格式保存创建日期如何按日期排序
      • @SymonKt 日期/值已正确排序为字符串。
      猜你喜欢
      • 2016-12-04
      • 2012-05-24
      • 2018-06-21
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 2014-08-03
      • 1970-01-01
      相关资源
      最近更新 更多