如何在JPA条件API中创建“订单”子句,以避免日期的时间部分对日期字段进行排序。
等同于: - SELECT EMP_NAME,DOJ FROM EMPLOYEE ORDER BY trunc(DOJ)
。
答案 0 :(得分:0)
JPA 2.0规范没有定义任何日期提取功能。因此,您需要使用本机SQL或特定于JPA提供程序的语法。
如果您使用的是EclipseLink 2.4,则可以使用EXTRACT,
请参阅, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#Functions
在以前的EclipseLink版本中,您可以使用FUNC在JPQL中调用数据库特定的函数。
JPA 2.1草案定义了一个FUNCTION运算符。
答案 1 :(得分:0)
您可以使用CriteriaBuilder#function进行日期提取。但要小心,这种方法依赖于RDBMS特定的功能:这是 NOT 可移植。
查看我们与postgresql一起使用的示例
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
Root<Employee> employee = cq.from(Employee.class);
String postgresTimeUnit = "day";
Expression<Calendar> dateTruncExpr = cb.function("date_trunc", Calendar.class, cb.literal(postgresTimeUnit), employee.get(Employee_.date)).as(Calendar.class);
cq.select(
employee
).where(
// where stuff
).orderBy(
cb.asc(dateTruncExpr)
);
此示例使用postgresql函数 date_trunc 及其特定的dsl来描述日期字段(此处的'day'表示我们要提取日期字段的日期)
sql查询生成如下:
select employee0_.id as col_0_0_, employee0_.name as col_0_1_, employee0_.date as col_0_2_ from employee employee0_ order by date_trunc(?, employee0_.date) asc