如何在 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);