如何用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]);
如何解决这个问题?
多谢问候,大孙。
1条答案
按热度按时间nwwlzxa71#
您应该考虑使用命名参数绑定,而不是按如下方式通过串联直接添加参数:
此处hibernate最佳实践中描述的命名参数绑定的优点:
你不必担心sql注入,
hibernate将查询参数Map到正确的类型和类型
hibernate可以进行内部优化以提供更好的性能。
作为旁注,我看到您使用的是jpa的entity manager createnativequery,因此这将起作用:
query.setParameter("status_ids", statusIds);
如果您使用的是hibernate createsqlquery,则需要:query.setparameterlist(“status\u ids”,statusids);