构建用于EXISTS子查询的Cayenne表达式

时间:2017-05-04 23:07:46

标签: subquery exists apache-cayenne

我有以下可选的多对多关系:PackingSlip <->> LineItem

我需要将所有没有任何相关PackingSlip个实例的LineItem个实例与qtyOrdered&gt;匹配qtyShipped

对我来说最有意义的是写一个表达式:

PackingSlip.LINE_ITEMS.containsMatch(LineItem.QTY_ORDERED.lt(LineItem.QTY_SHIPPED)).notExp();

我希望按照以下方式生成SQL:

SELECT t0.id, ... FROM packing_slip t0
WHERE NOT ( 
  EXISTS ( 
    SELECT * FROM line_item t1 
    WHERE t1.packing_slip_id = t0.id 
    AND t1.qty_ordered < t1.qty_shipped
  )
)

显然,我已经制定了containsMatch(Expression)方法。既然这样的东西不存在(目前),在Cayenne 4.0中实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

虽然我不是EJBQLQuery的忠实粉丝,但它实际上可以帮助我们:

if (o is int i || (o is string s && int.TryParse(s, out i))
{
    Console.WriteLine(i.ToString());
}

以及String ejbql = "SELECT ps FROM PackingSlip ps " + "WHERE NOT EXISTS " + "(SELECT li FROM LineItem li WHERE li " + "MEMBER OF ps.lineItems AND li.qtyOdered < li.qtyShipped)"; EJBQLQuery query = new EJBQLQuery(ejbql); List<PackingSlip> objects = context.performQuery(query); 查询。