У меня есть следующий объект, который имеет отношение «многие ко многим» с теми же объектами. Когда я пытаюсь выполнить какой-либо запрос, возникает проблема выбора n + 1.
Я пытаюсь добавить аннотацию @Fetch и выполненный запрос, используя JOIN FETCH, но проблема не решена.Этот подход работает и решает проблему n + 1 для других отношений в этом классе (один к одному с UserSettings), но для многих ко многим это не работает.
@ToString
@Entity
@Data
@Table(name = "users")
@NoArgsConstructor
public class User {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@Fetch(FetchMode.JOIN)
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinTable(
name="user_friends",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="friend_id")
)
private Set<User> friends = new HashSet<>();
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "settings_id")
private UserSettings settings = new UserSettings(true, true, true);
public void addFriend(User user) {
friends.add(user);
}
}
public List<User> findByName(String name) {
try (Session session = sessionFactory.openSession()) {
Query<User> query = session.createQuery("FROM User u JOIN FETCH u.friends WHERE u.name=:name ");
query.setParameter("name", name);
return query.getResultList();
}
}