我有以下聊天课:
@Data
@Entity
@NoArgsConstructor
public class Chat extends BaseEntity {
@ManyToOne
@JoinColumn(name = "user1_id")
private User user1;
@ManyToOne
@JoinColumn(name = "user2_id")
private User user2;
@LazyCollection(LazyCollectionOption.EXTRA)
@OrderBy("sentAt DESC")
@OneToMany(mappedBy = "chat", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Message> messages = new ArrayList<>();
public Chat(User user1, User user2) {
this.user1 = user1;
this.user2 = user2;
}
}
关于messages
字段,我只想访问第一个元素,-这是本例的最新消息-
是否执行以下语句:chat.getMessages().get(0)
使整个messages
列表初始化?如果是,那么最佳实践是什么?
无法以这种方式工作。
根据休眠documentation:
[
LazyCollectionOption.EXTRA
仅适用于有序集合,用@OrderColumn
注释的列表或映射。对于袋(例如,不保留任何特定顺序的实体的常规列表),
@LazyCollection(LazyCollectionOption.EXTRA)
的行为类似于任何其他FetchType.LAZY
集合(该集合在首次访问时就被完全提取)。] >从另一面看,根据@OrderColumn注释的文档:
OrderBy
批注应用于进行排序,这些排序应显示为持久状态并由应用程序维护。OrderBy
注释在指定OrderColumn
时不使用。顺序列必须是整数类型。
在更新关联或元素集合时,持久性提供程序将保持顺序列值的连续(非稀疏)顺序。第一个元素的订单列值为0。因此,您不能使用
@OrderColumn
注释按日期/时间进行排序,因此不能将LazyCollectionOption.EXTRA
用于第一个元素的延迟加载。我建议您使用单独的查询来获取最后一个聊天消息。