'Hibernate keeps creating N+1 querys

I've got no idea why is this happening. I thought the "JOIN FETCH" thing and/or "EntityGraph" were meant to address this, but then the query made by Hibernate looks even more uglier. Here's my code:

Entity class:

package com.udemy.springgraphql.jpa.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Type;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.util.UUID;

@Entity
@Table(name = "review")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Review {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "UUID")
    @Type(type = "uuid-char")
    private UUID id;

    private String author;
    private String description;
    private int rating;
    private OffsetDateTime published;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "wadId")
    private Wad wad;

}

Repository class:

package com.udemy.springgraphql.jpa.repository;

import com.udemy.springgraphql.jpa.model.Review;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Set;
import java.util.UUID;

@Repository
public interface ReviewRepository extends JpaRepository<Review, UUID> {

    @Query("SELECT r FROM Review r JOIN FETCH r.map where r.id in (:ids)")
    @EntityGraph(attributePaths = {"map"})
    List<Review> findAllByIdPlusMaps(Set<UUID> ids);

}

And then the logs:

2022-04-29 10:03:16.768  INFO 27716 --- [pool-2-thread-1] c.u.s.service.impl.MapServiceImpl        : Starting query...
2022-04-29 10:03:16.780 DEBUG 27716 --- [nPool-worker-27] org.hibernate.SQL                        : select wad1_.id as id1_2_, wad1_.download_link as download2_2_, wad1_.genre as genre3_2_, wad1_.iwad as iwad4_2_, wad1_.name as name5_2_, wad1_.released as released6_2_ from review review0_ inner join wad wad1_ on review0_.wad_id=wad1_.id where review0_.id=?
2022-04-29 10:03:16.780 DEBUG 27716 --- [nPool-worker-23] org.hibernate.SQL                        : select wad1_.id as id1_2_, wad1_.download_link as download2_2_, wad1_.genre as genre3_2_, wad1_.iwad as iwad4_2_, wad1_.name as name5_2_, wad1_.released as released6_2_ from review review0_ inner join wad wad1_ on review0_.wad_id=wad1_.id where review0_.id=?
2022-04-29 10:03:16.780 DEBUG 27716 --- [nPool-worker-19] org.hibernate.SQL                        : select wad1_.id as id1_2_, wad1_.download_link as download2_2_, wad1_.genre as genre3_2_, wad1_.iwad as iwad4_2_, wad1_.name as name5_2_, wad1_.released as released6_2_ from review review0_ inner join wad wad1_ on review0_.wad_id=wad1_.id where review0_.id=?
2022-04-29 10:03:16.780 DEBUG 27716 --- [onPool-worker-5] org.hibernate.SQL                        : select wad1_.id as id1_2_, wad1_.download_link as download2_2_, wad1_.genre as genre3_2_, wad1_.iwad as iwad4_2_, wad1_.name as name5_2_, wad1_.released as released6_2_ from review review0_ inner join wad wad1_ on review0_.wad_id=wad1_.id where review0_.id=?
2022-04-29 10:03:16.780 DEBUG 27716 --- [onPool-worker-9] org.hibernate.SQL                        : select wad1_.id as id1_2_, wad1_.download_link as download2_2_, wad1_.genre as genre3_2_, wad1_.iwad as iwad4_2_, wad1_.name as name5_2_, wad1_.released as released6_2_ from review review0_ inner join wad wad1_ on review0_.wad_id=wad1_.id where review0_.id=?
2022-04-29 10:03:16.791 DEBUG 27716 --- [pool-2-thread-1] org.hibernate.SQL                        : select review0_.id as id1_1_0_, map1_.id as id1_0_1_, review0_.author as author2_1_0_, review0_.description as descript3_1_0_, review0_.map_id as map_id6_1_0_, review0_.published as publishe4_1_0_, review0_.rating as rating5_1_0_, review0_.wad_id as wad_id7_1_0_, map1_.author as author2_0_1_, map1_.enemies as enemies3_0_1_, map1_.name as name4_0_1_, map1_.partime as partime5_0_1_, map1_.wad_id as wad_id6_0_1_ from review review0_ inner join map map1_ on review0_.map_id=map1_.id where review0_.id in (? , ? , ? , ? , ?)
2022-04-29 10:03:16.797  INFO 27716 --- [pool-2-thread-1] c.u.s.service.impl.MapServiceImpl        : Ending query...

Any ideas? Thanks a lot, guys



Solution 1:[1]

It seems that I was looking at the wrong field: Wad instead of Map, since the query uses 2 of them. Also, only JOIN FETCH seems to be necessary to eliminate the issue.

Sorry for the mistake!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tomás Soares