Как написать предложение IN в запросе hibernate native (createNative)? - PullRequest
0 голосов
/ 21 июня 2020

Как завершить этот запрос с помощью предложения 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]);

Как решить эту проблему?

С уважением, Дасун.

1 Ответ

2 голосов
/ 21 июня 2020

Вам следует рассмотреть возможность использования привязок именованных параметров вместо добавления параметров напрямую путем конкатенации следующим образом:

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);

...