Я все еще новичок в Seam/Hibernate, и мне трудно найти решение этой проблемы. Существует сложная взаимосвязь, которую мне нужно искать, и одна из проблем заключается в том, что это должен быть «подобный» поиск для объединения двух столбцов в двух разных сопоставленных объектах. Список результатов представляет собой список сущностей PurchaseOrder, а вот отношения сопоставления: PurchaseOrder [ 1 -- 0..* ] LineItem [ 1 -- 0..* ] BillingCode [ 1 -- 1 ] Project [ 1..* - - 1 ] Компания.
По сути, «BillingCode» представлен «Company.companyCode || '-' || Project.projectCode», так что пользователь видит представленный код биллинга, и именно так он будет пытаться искать заказы на покупку, которые имеют по крайней мере один платежный код, такой как строка поиска, которую они вводят в интерфейсе. Я думаю, что у меня все в порядке, если я выполняю поиск равных, но клиент хотел бы иметь возможность возвращать что-либо с определенной строкой в репрезентативном коде выставления счетов. Вот где это становится сложно.
Я думаю, что было бы нормально, если бы я мог использовать псевдоним для подзапроса и ссылаться на этот псевдоним, но я знаю о ошибка, которая не исправлена в используемой нами версии Seam/Hibernate. В настоящее время я использую реализацию EntityQuery, но изучаю API критериев.
this.setEjbql("select purchaseOrder from PurchaseOrder as purchaseOrder left join fetch purchaseOrder.vendor");
@SuppressWarnings("rawtypes")
ValueExpression[] restrictionsArray = {
createValueExpression("purchaseOrder.purchaseOrderNumber = #{purchaseOrderQuery.prepRestriction(purchaseOrder.purchaseOrderNumber)}"),
createValueExpression("lower(concat(purchaseOrder.submitterEff.user.firstName, purchaseOrder.submitterEff.user.lastName)) like #{purchaseOrderQuery.preppedSubmitterName}"),
createValueExpression("lower(purchaseOrder.vendor.name) like #{purchaseOrderQuery.prepRestriction(purchaseOrderQuery.vendorName)}"),
createValueExpression("lower(concat(purchaseOrder.requestor.user.firstName, purchaseOrder.requestor.user.lastName)) like #{purchaseOrderQuery.preppedRequestorName}"),
createValueExpression("purchaseOrder.status = #{purchaseOrder.status}"),
createValueExpression("purchaseOrder.process = #{purchaseOrder.process}"),
createValueExpression("(select concat(company.companyCode, project.projectCode) from BillingCode as billingCode join billingCode.project as project join project.company as company join billingCode.lineItem as lineItem where lineItem.purchaseOrder = purchaseOrder)) like #{purchaseOrderQuery.preppedBillingCode}"),
createValueExpression("purchaseOrder.dateNeeded > #{purchaseOrderQuery.preppedDateNeededRange}")
};
this.setRestrictions(Arrays.asList(restrictionsArray));
Очевидно, проблема возникает в этом ограничении createValueExpression("(select concat(company.companyCode, project.projectCode) from BillingCode as billingCode join billingCode.project as project join project.company as company join billingCode.lineItem as lineItem where lineItem.purchaseOrder = purchaseOrder)) like #{purchaseOrderQuery.preppedBillingCode}"), потому что подзапрос возвращает более одного результата. Я предполагаю, что это может быть еще один вопрос, есть ли другой способ сделать что-то вроде запроса «в подобном»? Где параметр выполняет поиск для каждого результата в подзапросе?