在 Play 项目中,我有两种实体,A
和B
,以及两个关系,X
和Y
。 X
拥有 A
的情侣实体和 country
场,而Y
持有混合A-B
情侣。实体B
也持有 country
field 。我需要查询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的电脑DB模板一样。我想将这两个子查询合并为一个唯一的子查询,将其放在 subquery
中result
的参数线。
我已经尝试收集 id
来自 subqueryX
和subqueryY
,然后使用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...
最佳答案
我在这里看到两个解决方案:
- 使用RawSql执行您的 SQL 查询。
- 您有一组 id,并且需要一个对象列表,但当集合太大时,调用 .in() 会引发异常。因此,您可以将一组 id 拆分为更小的集合,并为每个集合调用 .in() 。然后将结果列表合并为一个列表。
关于java - Ebean 中的 UNION 运算符(或有效的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27057953/