在Seam中,如何创建HQL子查询限制/别名?

时间:2011-12-20 22:29:03

标签: hibernate subquery seam alias

我还是Seam / Hibernate的新手,我发现很难找到解决这个问题的方法。我需要搜索一个复杂的关系,其中一个问题是它需要在两个不同的映射实体上搜索两列的“类似”。结果列表是PurchaseOrder实体的列表,这里是映射关系:PurchaseOrder [1 - 0 .. *] LineItem [1 - 0 .. *] BillingCode [1 - 1] Project [1 .. * - - 1]公司。

基本上,“BillingCode”由“Company.companyCode ||' - '|| Project.projectCode”表示,因此用户可以看到代表的结算代码,以及他们将如何尝试搜索采购订单至少有一个帐单代码,例如他们在前端输入的搜索字符串。如果我做一个等于搜索的话,我认为我没有问题,但客户希望能够在代表性的账单代码中返回任何带有特定字符串的内容。这就是它变得棘手的地方。

我认为我可以为子查询添加别名并引用该别名,但我知道我们正在使用的Seam / Hibernate版本中的a bug that is not fixed。目前,我正在使用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}")中,因为子查询返回多个结果。我想这可能是另一个问题,还有另一种方法可以做某种类似“in like”的查询吗?参数在哪里搜索子查询中的每个结果?

1 个答案:

答案 0 :(得分:0)

我不是说这将是一个快速的解决方案,但要解决您的选择子查询结果问题,这就是您可以解决它的方法:

而不是写

从PurchaseOrder中选择purchaseOrder作为purchaseOrder其中(从BillingCode中选择concat(company.companyCode,project.projectCode)作为billingCode join billingCode.project作为项目加入project.company作为公司join billingCode.lineItem作为lineItem,其中lineItem.purchaseOrder = purchaseOrder ))喜欢#{purchaseOrderQuery.preppedBillingCode}

使用

从PurchaseOrder中选择purchaseOrder作为purchaseOrder,其中purchaseOrder IN(从PurchaseOrder po选择po加入你需要的东西,如#{input})

因此限制将是

purchaseOrder IN(以类似方式选择)