如何在 hibernate native(createNative) 查询中编写 IN 子句?
How to write IN clause in hibernate native(createNative) query?
如何使用 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);
执行时,查询后的结果为
SQLGrammerExecption.
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]);
如何解决?
感谢和问候,
大孙.
您应该考虑使用命名参数绑定,而不是直接通过串联添加参数,如下所示:
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 最佳实践中描述的命名参数绑定的优点 here:
- 你不用担心SQL注入,
- Hibernate 将您的查询参数映射到正确的类型并且
- Hibernate 可以进行内部优化以提供更好的
性能。
作为旁注,我看到您正在使用 JPA 的实体管理器 createNativeQuery,因此这将起作用:
query.setParameter("status_ids", statusIds);
如果您使用的是 Hibernate 创建SQL查询,则需要:
query.setParameterList("status_ids", statusIds);
如何使用 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);
执行时,查询后的结果为
SQLGrammerExecption.
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]);
如何解决?
感谢和问候, 大孙.
您应该考虑使用命名参数绑定,而不是直接通过串联添加参数,如下所示:
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 最佳实践中描述的命名参数绑定的优点 here:
- 你不用担心SQL注入,
- Hibernate 将您的查询参数映射到正确的类型并且
- Hibernate 可以进行内部优化以提供更好的 性能。
作为旁注,我看到您正在使用 JPA 的实体管理器 createNativeQuery,因此这将起作用:
query.setParameter("status_ids", statusIds);
如果您使用的是 Hibernate 创建SQL查询,则需要:
query.setParameterList("status_ids", statusIds);