Задать вопрос
@Skoleev

Почему @Fetch(FetchMode.SUBSELECT) тригерит 2 SQL вместо 1?

Есть простое энтити Restaurant, которое имеет список Vote ( Ненужные методы и филды не показаны )
public class Restaurant extends AbstractNamedEntity {
    @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, orphanRemoval = true)
    @JsonManagedReference
    @Fetch(FetchMode.SUBSELECT)
    private List<Vote> votes;
}

Вот другая сторона отношений
public class Vote extends AbstractBaseEntity {
    @ManyToOne
    @JsonBackReference
    private Restaurant restaurant;
}

Когда я получаю данные при помощи метода findAll() от Spring Data JPA и конверчу их через ДТО маппер вот так

@Cacheable(value = "restaurantDTOList", key = "-1")
    public List<RestaurantResponseDTO> getAll() {
        List<Restaurant> restaurantList = restaurantRepository.findAll();
        return restaurantList.stream()
                .map(RestaurantMapper::toRestaurantDto)
                .collect(Collectors.toList());
    }
  public static RestaurantResponseDTO toRestaurantDto(Restaurant restaurant) {

        return new RestaurantResponseDTO(restaurant.getId(), restaurant.getName(),
                restaurant.getAddress(), getRestaurantVoteCount(restaurant));
    }
    public static long getRestaurantVoteCount(Restaurant restaurant) {
    var votes = restaurant.getVotes();
    if (votes == null) return 0;
    return  votes.stream().filter(vote -> vote.getVoteDate().equals(LocalDate.now())).count();
}

Я получаю эти SQL
Hibernate: 
select
    restaurant0_.id as id1_1_,
    restaurant0_.name as name2_1_,
    restaurant0_.address as address3_1_ 
from
    restaurant restaurant0_

Hibernate: 
select
    votes0_.restaurant_id as restaura3_4_1_,
    votes0_.id as id1_4_1_,
    votes0_.id as id1_4_0_,
    votes0_.restaurant_id as restaura3_4_0_,
    votes0_.user_id as user_id4_4_0_,
    votes0_.vote_date as vote_dat2_4_0_ 
from
    vote votes0_ 
where
    votes0_.restaurant_id in (
        select
            restaurant0_.id 
        from
            restaurant restaurant0_
    )


Буду крайне благодарен, если поможете разобраться, почему 2 SQL, а не одно
  • Вопрос задан
  • 86 просмотров
Подписаться 2 Сложный Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы