Привязать определенный параметр (один) в JPQL - PullRequest
1 голос
/ 31 января 2012

В базе данных у меня есть таблица секционирования по столбцу «статус» для повышения производительности. Мой администратор базы данных спрашивает меня о вводе значения запроса для этого столбца непосредственно в sql (без привязки по параметру).

Я могу изменить привязку, установив подсказку QueryHints.BIND_PARAMETERS на false, но тогда все параметры находятся внутри sql.

Могу ли я установить не привязку только по параметру status?

Пример результата, когда BIND_PARAMETERS = true

SELECT t0.* FROM S_JOBS_ORG_UNIT_CFG t0 
WHERE ((((t0.ORG_ID = ?) AND (t0.SCHEDULER_NEXT_ACTIVATION < SYSDATE)) AND (t0.ACTIVE = ?)) 
AND NOT EXISTS (SELECT ? FROM S_JOBS t1 WHERE (((t1.ORDER_ID = t0.ORDER_ID) AND (t1.ORG_ID = t0.ORG_ID)) AND NOT ((t1.STATUS = ?)))) )
bind => [472100, Y, 1, E]

и результат, когда BIND_PARAMETERS = false

SELECT t0.* FROM S_JOBS_ORG_UNIT_CFG t0 
WHERE ((((t0.ORG_ID = 472100) AND (t0.SCHEDULER_NEXT_ACTIVATION < SYSDATE)) AND (t0.ACTIVE = Y)) 
AND NOT EXISTS (SELECT 1 FROM S_JOBS t1 WHERE (((t1.ORDER_ID = t0.ORDER_ID) AND (t1.ORG_ID = t0.ORG_ID)) AND NOT ((t1.STATUS = E)))) )

Код:

        Query jobOrgUnitCfgQuery = entityManager.createQuery(
            "SELECT c FROM JobOrgUnitCfg c WHERE c.orgId = :orgId and c.schedulerNextActivation < current_timestamp and c.active = :active and " +
            " not exists (SELECT j  FROM Job j WHERE j.orderId = c.orderId and j.orgId = c.orgId and j.status <> 'E')");

    jobOrgUnitCfgQuery.setParameter("orgId", orgId);
    jobOrgUnitCfgQuery.setParameter("active", Boolean.TRUE);
    return jobOrgUnitCfgQuery.getResultList();

1 Ответ

0 голосов
/ 19 апреля 2012

Я думаю, что вам лучше всего просто программно построить запрос, как если бы вы работали с жестко закодированным статусом, и вручную избегать других параметров, чтобы избежать SQL-инъекций.

...