我有以下可选的多对多关系: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中实现这一目标的最佳方法是什么?
答案 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);
查询。