Search code examples
javahibernatejakarta-eejpaeclipselink

Order By Oracle Function In JPA Criteria Builder


I have the following SQL

SELECT ID,LASTTIMEEXECUTEDDATE as d FROM STATISTICSDATE ORDER BY LASTTIMEEXECUTEDDATE

which using CriteriaBuilder works just fine:

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<StatisticsDate> cq = cb.createQuery(StatisticsDate.class);
    Root<StatisticsDate> rootEntry = cq.from(StatisticsDate.class);        
    CriteriaQuery<StatisticsDate> all = cq.select(rootEntry).orderBy(cb.desc(
    rootEntry.get("lastTimeExecutedDate")));
    TypedQuery<StatisticsDate> allQuery = em.createQuery(all);

However now i need to get more accurate results using this:

SELECT ID,LASTTIMEEXECUTEDDATE as d FROM STATISTICSDATE ORDER BY 
to_timestamp(LASTTIMEEXECUTEDDATE, 'DD.MM.YYYY:HH24:MI:SS')  desc;

I can do this via native sql BUT i would like to know if it is possible to use it via CriteriaBuilder.

What troubles me is to_timestamp(LASTTIMEEXECUTEDDATE, 'DD.MM.YYYY:HH24:MI:SS')

Thanks


Solution

  • Try it like this:

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<StatisticsDate> cq = cb.createQuery(StatisticsDate.class);
    Root<StatisticsDate> rootEntry = cq.from(StatisticsDate.class);
    CriteriaQuery<StatisticsDate> all = cq.select(rootEntry).orderBy(cb.desc(
        cb.function(
            "to_timestamp", Timestamp.class,
            rootEntry.get("lastTimeExecutedDate"),
            cb.literal("DD.MM.YYYY:HH24:MI:SS")
        )
    ));
    
    TypedQuery<StatisticsDate> allQuery = em.createQuery(all);