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:

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>();
}
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
 
  public List<Bill> findAll() {
        return entityManager.createQuery("select b from Bill b").getResultList();
    }
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.

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.