在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的计算机数据库模板类似。我想将两个子查询组合成一个唯一的子查询,将其放在subquery
行的result
参数中。
我已经尝试从id
和subqueryX
收集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 ...
答案 0 :(得分:2)
我在这里看到两个解决方案: