2012-01-31 68 views
1

中綁定特定參數(一)在數據庫中,爲了獲得更好的性能,我使用'status'列對錶進行分區。我的數據庫管理員詢問我直接在sql中輸入該列的查詢值(不通過參數綁定)。在JPQL

我可以通過設置提示QueryHints.BIND_PARAMETERS更改綁定上false,但然後所有參數都在sql裏面。

我可以設置只綁定'status'參數嗎?

結果舉例時BIND_PARAMETERS =真

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 =假

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(); 

回答

0

我認爲最好的方法就是以編程方式建立你像你在做一個硬編碼狀態的查詢,並逃脫另一個對手rs手動避免SQL注入。