Вам следует рассмотреть возможность использования привязок именованных параметров вместо добавления параметров напрямую путем конкатенации следующим образом:
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);
Преимущества привязок именованных параметров, как описано в передовых методах гибернации здесь :
- вам не нужно беспокоиться о SQL инъекции,
- Hibernate сопоставляет параметры вашего запроса с правильными типами и
- Hibernate может выполнять внутреннюю оптимизацию для повышения производительности.
В качестве примечания, я вижу, что вы используете JPA Entity Manager createNativeQuery, поэтому это будет работать: query.setParameter("status_ids", statusIds);
Если вы использовали Hibernate createSQLQuery, вам понадобится следующее:
query.setParameterList ("status_ids", statusIds);