У меня есть Postgres функция, возвращающая таблицу, например (взята из Postgres документов)
CREATE FUNCTION dup(int) RETURNS TABLE(f1 int, f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
Я создал неизменяемый объект для хранения его значений:
import javax.persistence.Entity;
import javax.persistence.Id;
import org.hibernate.annotations.Immutable;
@Entity
@Immutable
public class Dup {
@Id Integer f1;
String f2;
}
Простая выборка значений работает:
Integer f1 = 1;
RelationalFunctionCall<GraphView> dup = SQLExpressions
.relationalFunctionCall(Dup.class, "dup", f1);
sqlQueryFactory.select(dup).fetch();
, но попытка использовать предикаты не удалась:
sqlQueryFactory.select(dup)
.where(QDup.dup.f1.eq(42)
.fetch();
, с ошибкой:
org.springframework.jdbc.BadSqlGrammarException: null; bad SQL grammar [select dup(?)
where dup.f1 < ?]; nested exception is org.postgresql.util.PSQLException: ERROR: missing FROM-clause entry for table "dup"
Очевидно, запрос должен быть SELECT * FROM dup(1) WHERE f1 = 42;
и проблема заключается в том, что не используется sqlQueryFactory.from()
, но он не принимает RelationalFunctionCall
объект.
Возможно ли использовать табличную функцию в моем случае использования?