JPQL中绑定具体参数(一)

发布于 2025-01-01 03:02:30 字数 1427 浏览 4 评论 0原文

在数据库中,我按“状态”列对表进行分区,以获得更好的性能。我的数据库管理员询问我是否直接在 sql 中放入该列的查询值(不通过参数绑定)。

我可以通过将提示 QueryHints.BIND_PARAMETERS 设置为 false 来更改绑定,但所有参数都在 sql 内部。

我可以设置仅在“状态”参数上不绑定吗?

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

In database I have partitioning table by column 'status' for better performance. My database administrator ask me about put in query value for that column directly in sql (not bind by parameter).

I can change binding by set hint QueryHints.BIND_PARAMETERS on false, but then all parameters are inside sql.

Can I set not bind only on 'status' parameter ?

Example result when 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]

and result when 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)))) )

Code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不寐倦长更 2025-01-08 03:02:30

我认为最好的选择是以编程方式构建查询,就像使用硬编码状态一样,并手动转义其他参数以避免 SQL 注入。

I think your best bet is just to programmatically build your query like you're doing with a hard coded status and escape the other paramaters manually to avoid SQL Injection.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文