JPQL - (JPA) ORA-00920: недопустимый реляционный оператор

List<InvTrnTransactionHeader> list = em.createQuery("SELECT p FROM InvTrnTransactionHeader p WHERE p.warehouse.warehouseCode IN :warehouseCode And (p.issueToWarehouseId IN :issuedWhId OR :issuedWhId is null ) And ( p.invTrnTransactionHeaderPK.transactionId IN :transactionCode OR :transactionCode is null ) And (p.vendorId IN :vendorId OR :vendorId is null) And p.invTrnTransactionHeaderPK.transactionDocumentDate >=:fromDate And p.invTrnTransactionHeaderPK.transactionDocumentDate <=:toDate And (p.invTrnTransactionHeaderPK.transactionDocumentNumber >=:fromDocument  OR :fromDocument is null) And (p.invTrnTransactionHeaderPK.transactionDocumentNumber <=:toDocument  OR :toDocument is null) And (p.vendorInvoiceNumber >=:fromInvoice  OR :fromInvoice is null) And (p.vendorInvoiceNumber <=:toInvoice  OR :toInvoice is null)")
           .setParameter("warehouseCode", warehouseCode)
           .setParameter("issuedWhId", issuedWhId)
            .setParameter("transactionCode", transactionId)
            .setParameter("vendorId", vendorId)
            .setParameter("fromDate", fromDate)
            .setParameter("toDate", toDate)
            .setParameter("fromDocument", fromDocument)
            .setParameter("toDocument", toDocument)
            .setParameter("fromInvoice", fromInvoiceNum)
            .setParameter("toInvoice", toInvoiceNum)
            .getResultList();

Запрос работает, если это нулевой случай... иначе, когда заполнить все параметры списка, запрос не работает... любая помощь?

1 ответ

Решение

Ваша проблема, когда вы используете

WHERE p.warehouse.warehouseCode IN:warehouseCode

Любой из операторов IN, тогда, если переменная warehouseCode пуста, JPA преобразует SQL в IN () без элементов и является неправильной структурой SQL.

Чтобы исправить это, вы должны быть уверены, что атрибут warehouseCode и все остальные, которые вы используете в условии IN, не пусты

Обновить:

Также посмотрите на эту ссылку. Подготовленный оператор IN, вам нужно использовать метод setArray() вместо setParameter() и использовать Array.

Другие вопросы по тегам