如果定义了以下Spring JPA实体:
@Entity
class Album(
@Id
val id: Long = 0,
...
@OneToMany(mappedBy = "album")
val mediaItems: Set<Media>) : Serializable
@Entity
@Table(name = "media")
class Media(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "serial")
var id: Long? = null,
@Column
@Lob
var content: ByteArray
该定义包括一个延迟获取的@Lob列,由于底层数据库使用Postgres大对象,因此实际上是懒惰的。我的春天jpa是由冬眠支持的。循环遍历mediaItems spring jpa条目时,所有条目都会自动获取其关联的@Lob内容,甚至不会触及内容列。当前序列化不需要此Lob输出,并且极大地减慢了循环速度。这是我的循环:
val albumProtocs = MediaProtocs.AlbumList.newBuilder().addAllAlbum(
ownAlbum.map { album ->
MediaProtocs.Album.newBuilder()
.setId(album.id)
.setName(album.name)
.addAllMedia(album.mediaItems.map { media ->
MediaProtocs.Media.newBuilder().setId(media.id as Long)
.setDescription(media.description)
.setMimeType(media.mimetype).build()
}).build()
}).build()
答案 0 :(得分:1)
如果你调用实体对象的任何方法,除了getter之外,Hibernate会加载所有惰性字段。你只需要找到被调用的方法。
您可以尝试在没有相册的情况下直接加载媒体列表。您也可以尝试使用投影将媒体列表加载到DTO列表。