【问题标题】:UNION operator in Ebean (or valid alternatives)Ebean 中的 UNION 运算符(或有效的替代方案)
【发布时间】:2014-11-21 09:23:39
【问题描述】:

在 Play 项目中,我有两种实体,AB,以及两种关系,XYX 包含一对 A 实体和一个 country 字段,而 Y 包含混合的 A-B 对。实体 B 也包含一个 country 字段。我需要查询A,它告诉我AXX.country='US' 关系中的第二个实体,还是YY.B.country='US' 关系中的第二个实体。此查询的有效 PostgreSQL 语句是:

 SELECT * FROM A WHERE A.id IN 
  (
   (SELECT X.a2_id FROM X WHERE country = 'US')
    UNION 
   (SELECT Y.a_id FROM Y WHERE b_id IN
    (SELECT B.id FROM B WHERE B.country = 'US')
   )
  );

使用 Ebean,我设法让每个子查询都能正常工作,只是我错过了 union 声明:

 Query subqueryX = X.find.select("a2.id")
        .where().eq("country","US").query();

 Query subqueryY = Y.find.select("a.id")
        .where().eq("b.country", "US").query();

 List<A> result = A.find.where().in("id", subquery).findList();

这里,findplay.db.ebean.Model.Finder&lt;Id.class, Entity.class&gt;,就像在 Play 的计算机数据库模板中一样。我想将这两个子查询组合成一个独特的子查询,将其放在result 行的subquery 参数中。

我已经尝试从subqueryXsubqueryY 收集ids,然后使用ExpressionList&lt;T&gt;.in(String propertyName, Collection&lt;?&gt; values),但是如果Collection 变得太大,我得到了java.sql.SQLException: Connection is closed! (通常是这样)。

有什么建议吗?

编辑

等等,还有

    List<A> result = A.find.where().in("id", subquery).findList();

失败了,给我一个java.sql.SQLException: Connection is closed!。所以问题就打开了我如何在ebean中实现上面的SQL查询?

附:当.in() 方法中的集合中大约有 32750 个 id 时,连接将关闭...

【问题讨论】:

  • 我设法让它直接执行RawSql,但生成的查询返回一个完全错误的findRowCount()...这是一个错误还是我遗漏了什么?

标签: java sql postgresql playframework ebean


【解决方案1】:

我在这里看到了两种解决方案:

  1. 使用RawSql 执行您的SQL 查询。
  2. 您有一组 id 并且想要一个对象列表,但是当集合太大时调用 .in() 会引发异常。因此,您可以将一组 id 拆分为较小的集合,并为每个集合调用 .in() 。然后将结果列表合并为一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多