Spring data jpa repository возвращает несколько подсчетов - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующие доменные объекты: Диалог , который имеет список Сообщение s, у каждого из них есть набор newFor Участник s.Для кого сообщение в списке еще не прочитано.

Я пытаюсь написать метод интерфейса (или запрос) репозитория для извлечения карты бесед, содержащих несколько непрочитанных сообщений для этого участника.

Atm Я использую следующее, чтобы получить только список бесед:

@Query("SELECT c from Conversation c JOIN c.participants p WHERE :participant IN p")
List<Conversation> findByParticipantsIn(Participant participant, Pageable pageable);

Но мне нужно как-то обновить запрос, чтобы иметь возможность включать количество вложенных непрочитанных сообщений.Что-то в этом роде:

@Query("SELECT c, count(..my problem is here..) from Conversation c LEFT JOIN c.participants p WHERE :participant IN p ")
List<Object[]> findByParticipantsIn(Participant participant, Pageable pageable);

Кто-нибудь знает, как поместить объединения в count () или что еще можно здесь использовать?

UPD

Фрагменты сущности, раскрывающие отношения:

public class Conversation {
...
    @OneToMany(cascade = CascadeType.ALL)
    private List<Message> messages = new ArrayList<>();
...
    @ManyToMany(fetch = FetchType.EAGER)
    private Set<Participant> participants = new LinkedHashSet<>();
...
}

public class Message {
...
    @ManyToMany(fetch = FetchType.EAGER)
    private Set<Participant> newFor = new HashSet<>();
...
}

Участник не знает Сообщение и Диалог существование.

1 Ответ

0 голосов
/ 03 января 2019

Наконец, я мог бы выполнить задачу извлечения данных, используя один метод репозитория, следующим образом:

@Query("SELECT c, (SELECT COUNT(m) FROM Message m WHERE m.conversation = c AND :participant MEMBER OF m.newFor) " +
        "FROM Conversation c " +
        "WHERE :participant MEMBER OF c.participants " +
        "GROUP BY c, c.lastMessage.createdDate " +
        "ORDER BY c.lastMessage.createdDate DESC")
List<Object[]> findConversationsPerParticipant(Participant participant, Pageable pageable);

Этот запрос извлекает диалоги для данного participant плюс количество непрочитанных сообщений в соответствии сописанная выше модель данных.

Не уверен, что этот подход достаточно эффективен, но я считаю, что он может работать быстрее, чем 2 отдельных вызова удаленной БД.

...