1
select * from xyz where  to_char(sdateAndTime,'DD-MM-YYYY')=(select max( to_char(sdateAndTime,'DD-MM-YYYY')) as dt from xyz))

sdateAndTime is timestamp field in oracle db. i am interested to fetch record for that given date and not in hh:mm:ss:zzzz AM/PM.

Trying to build criteria for it but :(

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<XYZ> criteria = builder.createQuery(XYZ.class);
Root<XYZ> root = criteria.from(XYZ.class);
criteria.select(root);
Subquery<XYZ> sub = criteria.subquery(XYZ.class);
Root subRoot = sub.from(XYZ.class);
sub.select(builder.max(subRoot.get("sdateAndTime")));
criteria.select(root).where(builder.in(root.get("sdateAndTime")).value(sub);
entityManager.createQuery(criteria);

我能够达到 dd:hh:mm:ss 的提取最大值,但无法获得相当于 to_char(sdateAndTime,'DD-MM-YYYY')

投入将不胜感激。谢谢

4

2 回答 2

2

您可以使用 function() API 来调用数据库函数,例如“TO_CHAR”。

https://en.wikibooks.org/wiki/Java_Persistence/Criteria#Special_Operations

于 2013-09-16T15:06:52.847 回答
1

感谢詹姆斯的投入......!

我通过以下更改修改了上述条件查询以获得所需的结果。

Subquery<String> sub = criteria.subquery(String.class);
        Root subRoot = sub.from(XYZ.class);
        sub.select(builder.substring(builder.greatest(builder.function("TO_CHAR", String.class, subRoot.get("sdateAndTime"))),0,10));
        criteria.select(root).where(
                builder.equal(builder.substring(builder.function("TO_CHAR", String.class, root.get("sdateAndTime")),0,10),sub)

注意:我无法将 DD-MM-YYYY 作为参数传递,因此作为解决方法使用了子字符串。更好的解决方案将不胜感激。

于 2013-09-21T00:08:16.983 回答