这听起来像是一个简单的问题,但我在网上找不到简单的解决方案。
我正在尝试在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
时间太长了,弄乱了分类。我正在尝试忽略它们/在加载我的条目之前格式化日期。我发现的一种方法是对ORDER_BY
应用TO_TIMESTAMP
。它在SQL中工作得很好,但在进入Hibernate时,就没那么简单了。
实际上,我的代码如下所示:
criteria.addOrder(Order.asc(fieldName));
我尝试了一些微不足道的解决方案,显然不起作用:
criteria.addOrder(Order.asc("TO_TIMESTAMP(" + fieldName + ", 'dd/MM/yyyy')");
对于它,我有以下错误(limitDate
是Java name,LIMIT_DATE
是相应的列):
org.hibernate.QueryException: could not resolve property: TO_TIMESTAMP(limitDate, 'dd/MM/yyyy')
如何对我的ORDER BY
成员应用TO_TIMESTAMP
?(不用担心,我们假设这里的所有成员都是日期,无论是在Java中还是在SQL表中)。
发布于 2021-05-20 22:16:06
这是不可能的,但是您可以子类化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")))
https://stackoverflow.com/questions/67604321
复制相似问题