У меня проблема с производительностью базы данных.
Предположим, что моя модель данных выглядит следующим образом.
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
в полях фотографии.
В принципе, у меня есть сомнения между этими двумя подходами.
Два независимых запроса, первый из которых извлекает UserTable
из базы данных по идентификатору, а второй - фотографии, что-то вроде SELECT * FROM Photo WHERE userId = :userId
.
Один запрос join fetch
для пользователя с соответствующими фотографиями.Тем не менее, я не совсем уверен, как этот запрос будет идти, так как фотографии разделены на альбом и фотографии профиля.Я обнаружил в этой статье что-то вроде
comments = entityManager.createQuery (
"select pc" + "из PostComment pc" + "join fetch pc.post"+ "где pc.review =: обзор", PostComment.class) .setParameter ("обзор", обзор) .getResultList ();
следует использовать, но я неуверен, как применить его к моему варианту использования.
Вопрос в том, какой подход лучше с точки зрения производительности, а если 2-й, как должен быть структурирован запрос?