Я все еще новичок в Seam / Hibernate, и мне трудно найти решение этой проблемы.Существует сложная взаимосвязь, по которой мне нужно искать, и одна из проблем заключается в том, что это должен быть «похожий» поиск для конкатенации двух столбцов на двух разных сопоставленных объектах.Список результатов представляет собой список сущностей PurchaseOrder и вот отношения сопоставления: PurchaseOrder [1 - 0 .. *] LineItem [1 - 0 .. *] BillingCode [1 - 1] Project [1 .. * -- 1] Company.
По сути, "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}")
, поскольку подзапрос возвращает более одного результата.Я думаю, это может быть другой вопрос, есть ли другой способ сделать что-то вроде запроса типа «как в»?Где параметр выполняет поиск похожих результатов для каждого подзапроса?