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.