QuerySyntaxException: неожиданный токен: использование построителя критериев, чтобы сделать разницу между датами в postgresql - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь сделать следующий запрос, используя спецификацию Jpa, я использую Postgresql:

select * from record rec inner join record_history rec_hist on rec.id=rec_hist.official_record_id and (rec_hist.state=rec.state) where
extract(epoch from (current_timestamp - rec_hist.create_date)) > rec_hist.standard_duration

В методе «toprediacte» я написал следующий код, используя построитель критериев

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
    Join historyJoin = root.join("recordHistory");
    historyJoin.on(cb.equal(historyJoin.get("state"), root.get("state")));

    Expression<Timestamp> epoch = cb.function(
            "epoch",
            Timestamp.class,
            new UnitExpression(null, String.class, "from"),
            historyJoin.<Timestamp>get("createDate"));

    Expression<Integer> extract = cb.function(
            "extract",
            Integer.class,
            epoch);

    Predicate durationPredicate = cb.greaterThan(historyJoin.<Integer>get("standardDuration"), extract);

    return cb.and(cb.and(super.toPredicate(root, cq, cb)), durationPredicate);
}

Если я запускаю этот код, я получаю следующее исключение

 QuerySyntaxException: unexpected token: , near line 1, column 323 [select generatedAlias0 from Record as generatedAlias0 inner join generatedAlias0.recordHistory as generatedAlias1 with generatedAlias1.state=generatedAlias0.state where ( 1=1 ) and ( generatedAlias1.standardDuration>function('extract', function('epoch', from, generatedAlias1.createDate)) )]]

Можете ли вы помочь мне понять, как реализовать этот запрос?

Спасибо

...