【发布时间】:2019-01-24 15:40:34
【问题描述】:
我有一个数据库性能问题。
假设我的数据模型如下所示。
UserTable.java
@Id
@Column(name = "USER_ID", nullable = false)
private Long userId;
// other user fields
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<ProfilePhotoTable> photos = new HashSet<>();
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private Set<AlbumPhotoTable> photos = new HashSet<>();
PhotoTable.java
@Id
@Column(name = "PHOTO_ID", nullable = false)
private Long photoId;
// other photo fields
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private UserTable user;
ProfilePhotoTable.java
@Entity
@Table(name = "PROFILEPHOTO")
@PrimaryKeyJoinColumn(name = "PROFILEPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
AlbumPhotoTable.java
@Entity
@Table(name = "ALBUMPHOTO")
@PrimaryKeyJoinColumn(name = "ALBUMPHOTO_ID", referencedColumnName = "PHOTO_ID")
public class ProfilePhotoTable extends PhotoTable
现在假设我想编写一个查询来获取用户的所有照片 - 所有个人资料照片和所有相册照片。
但是,我不希望每次从数据库中请求用户信息时都获取照片,这就是我在照片字段上指定 fetch = FetchType.LAZY 的原因。
基本上,我对这两种方法有疑问。
-
两个独立的查询,第一个通过 ID 从数据库中获取
UserTable,第二个获取照片,类似于SELECT * FROM Photo WHERE userId = :userId。 -
一个查询将
join fetch用户与相应的照片。但是,我不太确定这个查询会如何进行,因为照片在相册和个人资料照片中是分开的。我在article 中发现了类似cmets = entityManager.createQuery(
"选择电脑" + “来自 PostComment 电脑” + "加入获取 pc.post" + "其中 pc.review = :review", PostComment.class) .setParameter("审查", 审查) .getResultList();
应该使用,但我不确定如何将它应用到我的用例中。
问题是,哪种方法在性能方面更好,如果是第二种,查询应该如何构建?
【问题讨论】:
-
..您可以使
user急切(=“不懒惰”)(以实现您想要的(据我所知)..而“懒惰”在“ N: -" 关联方)
标签: java sql spring hibernate jpa