【问题标题】:Building Cayenne Expressions for EXISTS subqueries为 EXISTS 子查询构建 Cayenne 表达式
【发布时间】:2017-10-03 07:03:15
【问题描述】:

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

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

【问题讨论】:

  • 您好,您找到答案了吗?我需要做类似的事情。

标签: subquery exists apache-cayenne


【解决方案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查询。

【讨论】:

  • 谢谢@andrus_a。 EJBQL 总是像手动编写 SQL 一样让我印象深刻。它带有许多与我使用像 Cayenne 这样的 ORM 来避免的相同缺点! EJBQL(就像硬编码的 SQL)很容易与数据库不同步。例如,没有编译器在后面告诉我LineItem 已重命名为OrderItem。这一切都在我身上,正如任何人都可以告诉你的那样,这不是无错误代码的秘诀。
猜你喜欢
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多