Interface ChatMessageRepository

All Superinterfaces:
org.springframework.data.repository.CrudRepository<ChatMessage,Long>, org.springframework.data.jpa.repository.JpaRepository<ChatMessage,Long>, org.springframework.data.repository.ListCrudRepository<ChatMessage,Long>, org.springframework.data.repository.ListPagingAndSortingRepository<ChatMessage,Long>, org.springframework.data.repository.PagingAndSortingRepository<ChatMessage,Long>, org.springframework.data.repository.query.QueryByExampleExecutor<ChatMessage>, org.springframework.data.repository.Repository<ChatMessage,Long>

@Repository public interface ChatMessageRepository extends org.springframework.data.jpa.repository.JpaRepository<ChatMessage,Long>
  • Method Details

    • findByPrivateChatIdAndDeletedFalseOrderByTimestampAsc

      List<ChatMessage> findByPrivateChatIdAndDeletedFalseOrderByTimestampAsc(Long privateChatId)
    • findByGroupIdAndDeletedFalseOrderByTimestampAsc

      List<ChatMessage> findByGroupIdAndDeletedFalseOrderByTimestampAsc(Long groupId)
    • countBySender

      long countBySender(User sender)
    • findTop10BySenderOrderByTimestampDesc

      List<ChatMessage> findTop10BySenderOrderByTimestampDesc(User sender)
    • findLastMessagesByPrivateChatIds

      @Query("select m.privateChat.id as privateChatId, max(m.timestamp) as lastMessageAt\nfrom ChatMessage m\nwhere m.privateChat.id in :privateChatIds\ngroup by m.privateChat.id\n") List<ChatMessageRepository.PrivateChatLastMessage> findLastMessagesByPrivateChatIds(@Param("privateChatIds") Collection<Long> privateChatIds)
      Returns the latest timestamp per nonempty chat without loading message payloads. Deleted messages remain included, matching the dashboard's existing summary behavior.
    • deleteByPrivateChat

      int deleteByPrivateChat(PrivateChat privateChat)
    • deleteByPoll

      void deleteByPoll(Poll poll)
    • findByClientMessageId

      Optional<ChatMessage> findByClientMessageId(String clientMessageId)
    • findWithLockByClientMessageId

      @Lock(PESSIMISTIC_WRITE) Optional<ChatMessage> findWithLockByClientMessageId(String clientMessageId)
    • markPrivateChatAsRead

      @Modifying @Query("update ChatMessage m\nset m.status = :read, m.readAt = :now, m.deliveredAt = coalesce(m.deliveredAt, :now)\nwhere m.privateChat.id = :privateChatId\n and m.sender.id <> :readerId\n and (m.status is null or m.status <> :read)\n") int markPrivateChatAsRead(@Param("privateChatId") Long privateChatId, @Param("readerId") Long readerId, @Param("read") MessageStatus read, @Param("now") Instant now)
      Marks messages sent by the other participant as READ. Never moves a status backwards.