2015-06-16 3 views
1

Я использую Play Framework 2 (Java) вместе с Ebean. Среди моих классов моделей у меня есть classA с отношением «один ко многим» к classB. Соответствующая таблица для classB поэтому имеет поле, которое либо содержит null, либо идентификатор для объекта classA.Извлечение числа строк с непустым отношением «один ко многим»

Я хотел бы получить число строк classA, для которых есть один или несколько связанных объектов classB. В SQL-терминах я хочу сделать следующее:

select count(id) from classA where id in (select classA_id from classB); 

Как это сделать с помощью Play Framework/Ebean?

Я думаю, что для выполнения этой простой задачи должен быть встроенный метод, а не использовать необработанный SQL. Обратите внимание, что нецелесообразно извлекать длинный список из базы данных, а затем подсчитывать количество записей в Java: я хочу, чтобы база данных выполняла эту работу.

+0

'select count (different a.id) from classA a join classB b on b.classA_id = a.id' –

+0

Это еще необработанный SQL. Как бы вы это сделали с Ebean? – plade

ответ

0

Посмотрите на documentation, они очень хорошо объясняют, как создавать запросы.

int count = 
    Ebean.find(classB.class) 
    .fetch("id") 
    .where("classA_id IS NOT NULL") 
    .findRowCount(); 

В случае, если вы хотите «отличный» результат, добавьте .setDistinct(true) к запросу.

+0

Это не плохое решение, и я могу даже уменьшить количество необработанного SQL с помощью встроенного 'isNotNull()' для записи '.where(). IsNotNull (" classA ")'. Остается только проблема: '.setDistinct()' (который мне определенно нужен) не работает в Ebean (по крайней мере, не в Play Framework 2.3.9): http://stackoverflow.com/questions/19472511/ebean- query-using-setdistinct-does-not-work – plade

+0

Обновляет ли Play Framework 2.4 опцию? Они заявляют, что 2,4 будут поддерживать более новые версии EBean. – Peanut

+0

Это не вариант сейчас, к сожалению. – plade

Смежные вопросы