2014-11-21 33 views
1

在Play项目中,我有两种实体AB,以及两个关系XYX拥有A实体和country字段的夫妇,而Y拥有混合A-B对夫妇。实体B也保存country字段。我需要对A进行查询,该查询告诉我A是与X.country='US'YY.B.country='US'的关系中的关系中的第二个实体。此查询的工作PostgreSQL的说法是:Ebean中的UNION运算符(或有效替代方法)

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的计算机数据库模板。我想将这两个子查询合并到一个唯一的子查询中,以将它放入result行的subquery参数中。

我已经试图从subqueryXsubqueryY两个,然后使用ExpressionList<T>.in(String propertyName, Collection<?> values)收集id S,但后来我得到了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查询?

P.S.连接关闭时,在.in()方法集合中约有32750个IDS ...

+0

我设法让它直接执行'RawSql',但生成的查询返回完全错误的'findRowCount()'...这是一个错误还是我错过了一些东西? – davide 2014-11-21 13:19:24

回答

2

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

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