java - Ebean 中的 UNION 运算符(或有效的替代方案)

标签 java sql postgresql playframework ebean

在 Play 项目中,我有两种实体,AB ,以及两个关系,XYX拥有 A 的情侣实体和 country场,而Y持有混合A-B情侣。实体B也持有 country field 。我需要查询A ,它告诉我是否 A是关系中的第二个实体 XX.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<Id.class, Entity.class> ,就像Play的电脑DB模板一样。我想将这两个子查询合并为一个唯一的子查询,将其放在 subqueryresult的参数线。

我已经尝试收集 id来自 subqueryXsubqueryY ,然后使用ExpressionList<T>.in(String propertyName, Collection<?> values) ,但后来我得到了 java.sql.SQLException: Connection is closed!如果Collection变得太大(通常是这种情况)。

有什么建议吗?

编辑

等等,还有

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

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

附注连接在 .in() 中的集合中时关闭方法大约有 32750 个 ids...

最佳答案

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

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

关于java - Ebean 中的 UNION 运算符(或有效的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27057953/

相关文章:

sql - 在 PostgreSQL 上以正确的顺序对数组元素进行分组

json - 将json结构转换为行

java - 如何在 JUnit 5 中使用 @RestTemplateClient?

java - 流口水专家/求解器 - 5.0.1 匹配

sql - 将 IF BEGIN END 与 CTE : Incorrect syntax near the keyword `End` 结合使用

MySQL 查询我所有(接受的) friend 的列表

java - 在 Bitmap 周围绘制渐变透明圆

java SSLHandshakeException 一般 SSLEngine

mysql - 使用触发器将数据从 SQL Server 插入到 MySql

ruby-on-rails - rails 测试数据库不会删除