如何在hibernate native(createnative)查询中写入in子句?

r1zk6ea1  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(397)

如何用in子句完成此查询?

ArrayList<Long> statusIds = new ArrayList<Long>();
        _merchantTransaction.getMerchantTxnStatusList().forEach(statusItem ->{
            statusIds.add(statusItem.getMerchantTxnStatusId());
        });
        Query query =  entityManager.createNativeQuery("select *"
                + " from merchant_transactions mt" 
                + " inner join appl_merchant_txn_statuses mts on mt.merchant_txn_status_id = mts.merchant_txn_status_id"
                + " where"
                  + " mt.customer_id ="+ _merchantTransaction.getCustomerId()
                  + " and mt.merchant_transaction_type_id = "+ _merchantTransaction.getMerchantTransactionType().getMerchantTransactionTypeId()
                  + " and mt.merchant_txn_status_id in " + statusIds
                  ,MerchantTransaction.class);

在执行时,此结果将跟踪查询并给出
SQLgrammerexeption。

select * 
from merchant_transactions mt where 
mt.customer_id = 3998 
and mt.merchant_transaction_type_id = 2 
and mt.merchant_txn_status_id in [1, 8]);

如何解决这个问题?
多谢问候,大孙。

nwwlzxa7

nwwlzxa71#

您应该考虑使用命名参数绑定,而不是按如下方式通过串联直接添加参数:

Query query =  
    entityManager.createNativeQuery("select *"
        + " from merchant_transactions mt" 
        + " inner join appl_merchant_txn_statuses mts on mt.merchant_txn_status_id = mts.merchant_txn_status_id"
        + " where mt.customer_id = :customer_id"
        + " and mt.merchant_transaction_type_id = :merchant_transaction_type_id"
        + " and mt.merchant_txn_status_id in (:status_ids)", MerchantTransaction.class);

query.setParameter("customer_id", _merchantTransaction.getCustomerId());
query.setParameter("merchant_transaction_type_id", _merchantTransaction.getMerchantTransactionType().getMerchantTransactionTypeId());
query.setParameter("status_ids", statusIds);

此处hibernate最佳实践中描述的命名参数绑定的优点:
你不必担心sql注入,
hibernate将查询参数Map到正确的类型和类型
hibernate可以进行内部优化以提供更好的性能。
作为旁注,我看到您使用的是jpa的entity manager createnativequery,因此这将起作用: query.setParameter("status_ids", statusIds); 如果您使用的是hibernate createsqlquery,则需要:
query.setparameterlist(“status\u ids”,statusids);

相关问题