Je débute avec JPA mais j'utilise Hibernate depuis longtemps. Là j'ai un souci d'optimisation des selects.
J'ai les 2 classes suivantes:
Ensuite j'ai un DAO JPA qui me sert notamment à récupérer tous les bills:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 @Entity public class Bill { @Id @GeneratedValue private long id; private long totalBytes; private long uploadedBytes; private String fileName; private Date billingDate; private Date importDate; @ManyToOne @Fetch(FetchMode.JOIN) private Customer customer; @ManyToOne private Format format; private String filePathOnServer; } @Entity public class Customer { @Id @GeneratedValue private long id; private String name; private String number; private Address postAddress; @OneToMany private Set<Bill> bills = new HashSet<Bill>(); }
Et avant même que j'appelle getCustomer() sur bill, Hibernate a déjà exécuté N+1 requêtes: 1 pour les bills, et N pour le customer de chaque bill. Or, je me serais attendu à ce qu'il n'exécute qu'une seule requête avec un join.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public List<Bill> findAll() { return entityManager.createQuery("select b from Bill b").getResultList(); }
Est-ce qu'il n'est pas censé faire ça par défaut? Sinon comment je peux forcer Hibernate à le faire?
Je précise que je suis sur une base MySQL 5.
Partager