1

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

我需要将所有PackingSlip没有任何相关LineItem实例的实例与qtyOrdered>匹配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 中实现这一目标的最佳方法是什么?

4

1 回答 1

1

虽然我不是 EJBQLQuery 的忠实粉丝,但它实际上可以在这里提供帮助:

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);

以及SQLSelect查询。

于 2017-05-10T07:15:34.043 回答