标准 ORDER BY 日期不起作用?
Criteria ORDER BY date not working?
你能帮我解决这个问题吗?我正在尝试按日期对条件查询的结果进行排序,但我没有得到我 need.I 以字符串格式保存日期的结果,如何使用条件
按日期排序
我使用的代码是:
@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
我需要select以上格式的日期。
非常感谢您的帮助。
在对条件执行 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;
}
编辑
在你的情况下,如果你想按字符串日期排序,正如我在评论中提到的那样,这个答案不是你能得到的正确答案(可能将 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);
}
});
条件被传递给 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;
}
首先,日期应该存储为日期,而不是字符串。如果您使用的是遗留系统,则可能无法更改此设置,但我认为咬紧牙关和重构可能会让您的生活更轻松。
作为字符串,排序函数有效,因为 05 在 06 之前。
我建议使用注释或映射,如 所述,将您的字符串转换为 pojo 中的日期,以便至少 某处[=22] 是正确的类型=] 在您的应用程序中。
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() {
}
}
这就是它的实现方式
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();
}
}
你能帮我解决这个问题吗?我正在尝试按日期对条件查询的结果进行排序,但我没有得到我 need.I 以字符串格式保存日期的结果,如何使用条件
按日期排序我使用的代码是:
@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
我需要select以上格式的日期。
非常感谢您的帮助。
在对条件执行 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;
}
编辑
在你的情况下,如果你想按字符串日期排序,正如我在评论中提到的那样,这个答案不是你能得到的正确答案(可能将 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);
}
});
条件被传递给 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;
}
首先,日期应该存储为日期,而不是字符串。如果您使用的是遗留系统,则可能无法更改此设置,但我认为咬紧牙关和重构可能会让您的生活更轻松。
作为字符串,排序函数有效,因为 05 在 06 之前。
我建议使用注释或映射,如
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() {
}
}
这就是它的实现方式
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();
}
}