Передача параметров во вложенный запрос (JPQL)

Здравствуйте! Как в отчете передать параметр во вложенный запрос?
Есть параметры дат, которые указывает пользователь, ${from} и ${to}.
Мне необходимо во вложенном запросе добавить условие, чтобы запрос находил максимальную цену за указанный период из параметров.

select distinct eol.product.name as product, eol.product.code as code,
eol.product.unit as unit,  eol.price as price, (select max(sml.price) as maxi from ekomerp$StockMovementLine sml where sml.product.id = eol.product.id and sml.price>0 ) 
from ekomerp$StockMovementLine eol

where eol.stockMovement.date between ${from} and ${to}

Кто-нибудь может подсказать решение моего вопроса?

  1. Раз речь идет о генераторе отчетов - посмотрите в сторону связывающего поля:

Поле Link field объединяет данные из нескольких наборов внутри одной полосы. Его используют, когда невозможно получить полный набор данных в одном запросе или скрипте Groovy.

Вы вполне можете одним запросом получать информацию, а во втором максимальную цену, связав по product.id

  1. Если искать решение именно в одном запросе, то чуть поэксперементировал. В конечном счете выходен медленнее, но в любом случае:
    Вы можете сделать агрегацию через left join
...
max(sml.price) as maxi
...
left join ekomerp$StockMovementLine sml on (sml.product = eol.product and sml.price>0)

И добавить условие для sml в where по дате.

Ваш случай не стал бы отдельно описывать, но попробовал запрос на похожей тестовой таблице:

select sml.product_id as product, sml.price as price, sml.date, max(cml.price) as max 
from  stock_movement_line sml
	left join stock_movement_line cml on (cml.product_id = sml.product_id and sml.price > 0)
where
	sml.date between to_date('20190314','YYYYMMDD') AND to_date('20190323','YYYYMMDD')
	and cml.date between to_date('20190314','YYYYMMDD') AND to_date('20190323','YYYYMMDD')
group by
	sml.product_id,
	sml.date,
	sml.price
order by 
	sml.date desc

Вроде бы, ничего запрещенного в рамках генератора отчетов/jpql не использовал, так что вполне можно перенести на ваши реалии
result + initial data (33,6 КБ)

data
CREATE TABLE public.stock_movement_line
(
  price integer,
  product_id integer,
  date date
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.stock_movement_line
  OWNER TO ivan;
  1. upd Опять же, поскольку речь идет о генераторе отчетов - у вас есть возможность преобразовать в groovy-шаблон и добавить условия поиска для подзапроса в groovy-код
(select max(sml.price) as maxi from ekomerp$StockMovementLine sml where sml.product.id = eol.product.id and sml.price>0 and sml.date between 
<%
out << "function('to_date', ${params['from']}, 'С форматом поразбираться нужно будет') ...etc"
%>
)

Но, скорее всего, все равно придется использовать нативные функции для преобразования даты

3 симпатии