Меня попросили преобразовать следующий собственный SQL запрос в JPQL.
SELECT
*
FROM
(SELECT
CUSTOMER_NAME,
CUSTOMER_ID,
CUSTOMER_KEY,
CUST_F_REF,
UV_ID,
IRC_SRC,
-------
-------
PRECEDING_CUSTOMER_KEY
FROM
( SELECT
CD.*,
CASE
WHEN CD.CUSTOMER_KEY=CD.PREC_CUSTOMER_KEY THEN NULL
ELSE CD.PREC_CUSTOMER_KEY
END AS PRECEDING_CUSTOMER_KEY
FROM
( SELECT
CDATA_1.EXEC_DATE AS REFERENCE_DATE,
CDATA_2.*,
FIRST_VALUE(CDATA_2.CUSTOMER_KEY) OVER( PARTITION
BY
CDATA_2.CUST_F_REF
ORDER BY
CDATA_2.EXEC_DATE ROWS 1 PRECEDING) AS PREC_CUSTOMER_KEY
FROM
( SELECT
CUST_F_REF,
UV_ID,
IRC_SRC,
EXEC_DATE
FROM
CUTOMER_DWH.QUERY_CUST_DATA_FULL_V SV
WHERE
1=1
AND CUSTOMER_KEY=? ) CDATA_1,
CUTOMER_DWH.QUERY_CUST_DATA_VCD_V CDATA_2
WHERE
CDATA_1.CUST_F_REF=CDATA_2.CUST_F_REF
OR (
CDATA_1.UV_ID=CDATA_2.UV_ID
AND CDATA_1.CUST_F_REF IS NULL
)
OR (
CDATA_1.IRC_SRC=CDATA_2.IRC_SRC
AND CDATA_1.CUST_F_REF IS NULL
AND CDATA_1.UV_ID IS NULL
)
) CD
WHERE
CD.EXEC_DATE=CD.REFERENCE_DATE
AND CUSTOMER_KEY=? )) CDATA
Это одно из существующих приложений, сделанных очень долго go, поэтому я понятия не имею, каковы фактические ожидаемые выходные данные. Я изучил и понял запрос самостоятельно.
1 = 1 необходимо удалить. Я вставил запрос так, как он существует.
Собственный запрос выполняется следующим образом:
em.createNativeQuery(query.toString(), QUERY_CUST_DATA_VCD_V.class);
q.setParameter(1, customerKey);
q.setParameter(2, customerKey);
После изучения нескольких существующих вопросов (например, this ), Я обнаружил, что невозможно конвертировать этот вложенный выбор в JPQL. Также одной из основных причин запроса этого изменения является защита его от атак уязвимости, поскольку это общедоступное приложение. После ссылки на подобный поток здесь я понял, что текущий собственный запрос безопасен.
- Возможно ли преобразовать этот запрос SQL в JPQL / HQL / Criteria любым другие средства?
- Защищена ли существующая реализация NativeQuery от уязвимости?
Любые предложения будут очень полезны.
Большое спасибо заранее.