N+1 requêtes sur un ManyToOne
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:
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:
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.