Ebean中的UNION运算符(或有效的替代)

时间:2014-11-21 09:23:39

标签: java sql postgresql playframework ebean

在Play项目中,我有两种实体AB,以及两种关系,XYX拥有A个实体和country字段,而Y拥有混合A-B个字段。实体B也拥有country字段。我需要对A进行查询,该查询告诉我A是否是XX.country='US'Y关系中的第二个实体与Y.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的计算机数据库模板类似。我想将两个子查询组合成一个唯一的子查询,将其放在subquery行的result参数中。

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

有什么建议吗?

修改

等等,

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

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

P.S。当.in()方法中的集合大约是32750 ids ...

时,连接将关闭

1 个答案:

答案 0 :(得分:2)

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

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