gpt4 book ai didi

java - Ebean 中的 UNION 运算符(或有效的替代方案)

转载 作者:行者123 更新时间:2023-11-29 13:02:00 26 4
gpt4 key购买 nike

在一个 Play 项目中,我有两种实体,AB , 和两个关系, XY . X拥有一对A实体和一个country字段,同时 Y持有混合A-B情侣。实体B也持有country field 。我需要查询 A ,它告诉我是否 A是关系中的第二个实体 XX.country='US'或者在 YY.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 的计算机数据库模板中一样。我想将两个子查询组合成一个唯一的子查询,将其放入 subqueryresult 的参数线。

我已经尝试收集 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 个 ID...

最佳答案

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

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

关于java - Ebean 中的 UNION 运算符(或有效的替代方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27057953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com