В Seam, как вы создаете ограничение / псевдоним подзапроса HQL? - PullRequest
0 голосов
/ 21 декабря 2011

Я все еще новичок в 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}"), поскольку подзапрос возвращает более одного результата.Я думаю, это может быть другой вопрос, есть ли другой способ сделать что-то вроде запроса типа «как в»?Где параметр выполняет поиск похожих результатов для каждого подзапроса?

1 Ответ

0 голосов
/ 21 декабря 2011

Я не говорю, что это будет быстрое решение, но для решения проблемы с выбранным подзапросом n результатов вы можете обойти это следующим образом:

вместо записи

выберите purchaseOrder из PurchaseOrder в качестве purchaseOrder, где (выберите concat (company.companyCode, project.projectCode) из BillingCode в качестве billingCode join billingCode.project в качестве присоединения проекта project.company в качестве присоединения компании billingCode.lineItem в качестве lineItem, где lineItem.purchaseOrder = purchaseOrder )) как # {purchaseOrderQuery.preppedBillingCode}

использовать

выберите purchaseOrder из PurchaseOrder в качестве purchaseOrder, где buyOrder IN (выберите po из PurchaseOrder po, чтобы присоединиться к тому, что вам нужно здесь, где-то вроде # {input})

так что ограничение будет

purchaseOrder IN (выбрать как)

...