У меня есть отношение @OneToMany
, и я использую Hibernate 5.3.7, чтобы написать выборку EAGER. Я понимаю, что выборка EAGER - это анти-шаблон, это очень специфический c вариант использования. Согласно этой статье я могу использовать FetchMode.JOIN
в своем TypedQuery
, и Hibernate должен создать хороший запрос для меня, однако я видел, что он спамит несколько десятков операторов select. Только когда я изменил это на FetchMode.SUBSELECT
, он сконцентрировал запрос в одном операторе выбора. Я понимаю, что это похоже на Почему Hibernate иногда игнорирует FetchMode.JOIN? , однако я не понимаю, почему FetchMode.JOIN
не работает, поскольку все это в запросе Hibernate. Есть идеи?
Ниже приведены аннотации, которые я использую на стороне OneToMany
:
@Entity
@Table(name = "auto", schema = "us")
public class Auto extends AbstractTable {
/** Ordered list of tires. */
@OneToMany(mappedBy = "auto", fetch = FetchType.EAGER, orphanRemoval = true)
@Fetch(FetchMode.SUBSELECT)
private List<Tire> tires;
...
}
Я использую SpringBoot с @PersistenceContext
, чтобы получить EntityManager
. Auto имеет двунаправленную OneToOne
связь с содержащим его классом AutoOwnerThing.
final String queryString = "FROM AutoOwnerThing e JOIN FETCH e.auto WHERE e.id in :ids";
TypedQuery<AutoOwnerThing> = entityManager.createQuery(queryString, AutoOwnerThing.class);