В проекте Play у меня есть два типа сущностей: A
и B
и два отношения: X
и Y
X
содержит пары объектов A
и поле country
, а Y
смешанные пары AB
. Предприятие B
также является полем country
. Мне нужно сделать запрос на A
, который говорит мне, является ли A
второй сущностью в отношении X
с X.country='US'
или в отношении Y
с YBcountry='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!
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!
, Итак, вопрос заключается в том, как я реализую SQL-запрос выше в ebean?
PS Соединение закрывается, когда в коллекции в методе .in()
находятся около 32750 идентификаторов...
Здесь я вижу два решения:
RawSql
, но полученный запрос возвращает совершенно неправильныйfindRowCount()
... Это ошибка или я что-то упустил?