标准ORDER BY日期不起作用?

时间:2016-11-14 12:58:55

标签: java hibernate hibernate-criteria

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

我使用的代码是:

@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

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

非常感谢您的帮助。

4 个答案:

答案 0 :(得分:4)

在对条件执行adb --help 方法之前,您必须致电criteria.addOrder(Order.asc("createdDate"));

list

修改

在您的情况下,如果您想按字符串日期排序,正如我在评论中提到的那样,这个答案并不是您可以得到的(可能会将creationDate转换为日期类型是最好的!当然)。< / p>

您可以尝试以下代码:

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

编辑2

如果您想避免使用lambdas,请尝试使用此代码:  

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

答案 1 :(得分:0)

标准被传递给Hibernate并被翻译成某种语言。它们出现在where的{​​{1}}子句之后,因此在执行查询之前必须设置所有限制。虽然您没有看到它,但在调用select时会生成并执行查询。

尝试以下方法:

criteria.list()

答案 2 :(得分:0)

首先,日期应存储为日期,而不是字符串。如果你正在使用遗留系统,可能无法改变这一点,但我认为它可能会让你的生活更容易咬住子弹并重构。

作为字符串,sort函数正常工作,因为05在06之前出现。

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

dependencyManagement

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

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

答案 3 :(得分:0)

这就是实施它的方式

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