Оператор UNION в Ebean (или действительные альтернативы)

1

В проекте 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 идентификаторов...

  • 0
    Мне удалось заставить его работать непосредственно, выполняя RawSql , но полученный запрос возвращает совершенно неправильный findRowCount() ... Это ошибка или я что-то упустил?
Теги:
playframework
ebean

1 ответ

2
Лучший ответ

Здесь я вижу два решения:

  1. Используйте RawSql для выполнения вашего SQL-запроса.
  2. У вас есть набор идентификаторов, и вам нужен список объектов, но вызов.in() вызывает исключение, когда коллекция слишком велика. Таким образом, вы можете разбить набор идентификаторов на меньшие наборы и вызвать.in() для каждого набора. Затем присоедините списки результатов в один список.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню