Я использую Java/Play 2.4/Ebean и мне нужно найти все записи в таблице А, не имеют соответствующую запись в таблице В.Ebean LEFT JOIN с условием на правой стороне
Это SQL Я хотел бы Ebean генерировать:
select a.*
from a
left join b
on a.b_id = b.id
where b.id is null;
Я думал, что это может быть правильный код, но это не так:
A = Ebean.find(models.A.class).fetch("bs").where().isNull("bs.id").findList();
, запрашивая все б для таблицы а (т.е. «BS») Ebean добавляет левое внешнее соединение на b. К сожалению, where() вызывает другое (внутреннее) соединение с таблицей b. Что-то вроде этого:
select a.*
from a
left outer join b
on a.b_id = b.id
join b
on a.b_id = b.id
where b.id is null;
Очевидно, что это не будет работать.
Как пользователь Ebean выполняет левое соединение с условием на правой стороне?
Спасибо, что я пытался # 2, но havent получил его для правильной работы. Есть два метода - с RaqlSqlBuilder.parse (sql) .create() Я получаю правильные результаты, но очень медленный - он делает один запрос на строку из первого запроса, пытаясь получить таблицу B для каждого A.ID индивидуально. с unparse() Я получаю ошибку: [PersistenceException: Query бросил SQLException: недопустимый индекс столбца. Я подойду к прямому sql, если придется, но это означает либо создание объектов индивидуально (SLOW), либо значительные изменения в моих представлениях, чтобы больше не использовать реальные объекты. В таком случае, зачем использовать ORM? – latj
Фактически, теперь, когда я смотрю более внимательно, когда я использую parse(), это не find (models.A.class) .setRawSql (rsql) .findList(), который вызывает одно-запрос на идентификатор. .. это должно быть в представлении.Возможно, у моего rsql отсутствует то, что нужно для просмотра ... – latj
Вы могли отслеживать потерю производительности? Я обновил свой ответ с другой мыслью о моем - в отношении оператора SQL – Anton