Spring Data JPA限制嵌套集合大小为Pageable

时间:2018-09-30 09:27:40

标签: java spring-boot collections spring-data-jpa lazy-loading

我正在使用SpringBoot 2.0.4。

这个想法是要检索一个 Conversation 实体,该实体包含 Message 对象的集合。但是我需要控制消息收集的大小,例如仅检索20个最新的消息。

@Entity
public class Conversation {
    //fields...
    @OneToMany(cascade = CascadeType.ALL)
    private List<Message> messages = new ArrayList<>();
    //methods...
}

@Entity
public class Message {
    //....
}

所以当我通过这样的ID检索对话时:

conversationRepository.findById(id)

如何仅包含x(例如20条)最新消息?

2 个答案:

答案 0 :(得分:0)

MessageRepository界面中,添加:

@Query("select messages from Conversation c inner join c.messages messages where c = :conversation")
  public Page < Message > findByConversation(@Param("conversation") Conversation conversation, Pageable pageable);

要返回最后20条(甚至n条)记录,请按消息ID降序对它们进行排序:

Pageable pageable = new PageRequest(0, 20, Sort.Direction.DESC, "id");
Page<Message> messages = repo.findByConversation(conversation, pageable); 
List<Message> last20MessageList = messages.getContent();

答案 1 :(得分:-1)

您可以根据自己的情况尝试使用此代码

Pageable pageable = new PageRequest(0, 20, Sort.Direction.DESC, "id");

Page<Message> lastPage = conversationRepository.findById(id, pageable);
// this is a list of the last 20 records
List<Message> latestMessage = lastPage .getContent();

希望获得帮助!