休眠条件-如何将函数应用于ORDERBY



这听起来是一个简单的问题,但我在网上找不到简单的解决方案。


我正在尝试在Hibernate中复制当前的ORDER BY,但没有成功:

SELECT * FROM IPEM.DEMANDE
WHERE INIT_DATE >= TO_TIMESTAMP('23/04/2021', 'dd/MM/yyyy') AND INIT_DATE <= 
TO_TIMESTAMP('29/04/2021', 'dd/MM/yyyy')
ORDER BY TO_TIMESTAMP(LIMIT_DATE, 'dd/MM/yyyy'), TO_TIMESTAMP(INIT_DATE , 'dd/MM/yyyy') ASC <<< this line

为什么?因为我的数据库中有这样的数据:

05/05/2021 00:00:00 - 23/04/2021 00:00:00
05/05/2021 00:00:00 - 28/04/2021 00:00:00 << this should be 3rd
05/05/2021 02:00:00 - 24/04/2021 00:00:00 << this should be 2nd

时间把分拣工作搞砸了。我试图在加载我的条目之前忽略它们/格式化日期。我发现这样做的一种方法是将TO_TIMESTAMP应用于ORDER_BY。它在SQL中运行得很好,但在使用Hibernate时,就没那么简单了。

实际上,我的代码是这样的:

criteria.addOrder(Order.asc(fieldName));

我尝试了一些琐碎的解决方案,但显然不起作用:

criteria.addOrder(Order.asc("TO_TIMESTAMP(" + fieldName + ", 'dd/MM/yyyy')");

对此,我有以下错误(limitDate是Java名称,LIMIT_DATE是相应的列(:

org.hibernate.QueryException: could not resolve property: TO_TIMESTAMP(limitDate, 'dd/MM/yyyy')

如何将TO_TIMESTAMP应用于ORDER BY的成员?(不用担心,我们假设这里所有的成员都是Java和SQL表中的日期(。

这是不可能的,但您可以将Order子类化并覆盖org.hibernate.criterion.Order#toSqlString方法来实现您需要的任何逻辑。无论如何,您应该从传统的Criteria API转移到JPA Criteria API。在那里你可以使用criteriaQuery.orderBy(criteriaBuilder.function("TO_TIMESTAMP", root.get(fieldName), criteriaBuilder.literal("dd/MM/yyyy")))

最新更新