Я пытаюсь сделать следующий запрос, используя спецификацию 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)) )]]
Можете ли вы помочь мне понять, как реализовать этот запрос?
Спасибо