Как использовать предикат с табличной функцией в QueryDSL - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть 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 объект.

Возможно ли использовать табличную функцию в моем случае использования?

...