Как решить n + 1 проблему выбора, когда мы имеем отношение многие ко многим с одними и теми же объектами? - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть следующий объект, который имеет отношение «многие ко многим» с теми же объектами. Когда я пытаюсь выполнить какой-либо запрос, возникает проблема выбора 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();
    }
}
...