【发布时间】:2014-11-21 09:23:39
【问题描述】:
在 Play 项目中,我有两种实体,A 和 B,以及两种关系,X 和 Y。 X 包含一对 A 实体和一个 country 字段,而 Y 包含混合的 A-B 对。实体 B 也包含一个 country 字段。我需要查询A,它告诉我A 是X 与X.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();
这里,find 是play.db.ebean.Model.Finder<Id.class, Entity.class>,就像在 Play 的计算机数据库模板中一样。我想将这两个子查询组合成一个独特的子查询,将其放在result 行的subquery 参数中。
我已经尝试从subqueryX 和subqueryY 收集ids,然后使用ExpressionList<T>.in(String propertyName, Collection<?> 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