Hibernate N + 1 проблема в отношениях OneToOne - PullRequest
0 голосов
/ 19 апреля 2019

Я использую spring-data-jpa с hibernate в приложении весенней загрузки для ORM. У меня проблема с отношением OneToOne, генерирующим N + 1 запросов, в то время как мне не нужно получать объект oneToOne.

Мои отношения OneToOne извлечены EAGERLY, я пытался использовать режим lazy with fetch для JOIN, но все еще не могу заставить его генерировать только один запрос.

Вот код для сущностей и запроса:

@Entity
@Table(name = "item")
public class Item implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
   @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

   @Column(name = "number")
   private String number;

   @Column(name = "date")
   private LocalDate date;

    @OneToOne(mappedBy = "item", fetch = FetchType.EAGER)
    @JsonIgnore
    private Status status;

}

@Entity
@Table(name = "status")
public class Status implements Serializable {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
   @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

   @OneToOne(fetch = FetchType.EAGER)
   @JoinColumn(unique = true)
   private Item item;

}

вот запрос в хранилище:

@Query(value = "SELECT * FROM ( SELECT  number, MAX(date) AS date FROM item WHERE date < ? GROUP BY number) AS latest_it INNER JOIN item ON item.number = latest_it.number AND item.date = latest_it.date", nativeQuery = true)
List<Item> findLatestByNumberAndDate(LocalDate localDate);

Когда я запускаю запрос, я получаю тоны запросов:

select status0_.id ... from status status0_ left outer join item item1_ on status0_.item_id=item1_.id left outer join status status2_ on item1_.id=status2_.item_id where status0_.item_id=?

Тогда как я ожидаю увидеть только мой запрос, определенный в репозитории, выполненным. Эта проблема очень мешает работе.

У вас есть подсказка об этом?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...