# Hibernate - LEFT JOIN vs. JOIN



## damien (21. Jul 2009)

Hallo,

folgender Sachverhalt ist gegeben:

Eine CD hat mehrere Interpreten, ein Interpret hat mehrere CDs !

Ist der Code so in Ordnung ? Was für einen Unterschied würde es machen wenn ich statt dem JOIN ein LEFT JOIN mache. Und, NUR mit einem FETCH würden die Interpreten mitgeladen werden, richtig ?


```
@Entity
@Table(name="cd")
@NamedQueries({
   @NamedQuery(name = "findCdByInterpretName",
            query = "SELECT c
                  "FROM Cd c JOIN c.interpeten i" +
                  "WHERE i.name =: " + "name")
})
public class Cd implements Java.io.Serializable {

   @Id
   @GeneratedValue(strategy=AUTO, generator="cd_sequence_name")
   @SequenceGenerator(name="cd_sequence_name", sequenceName="cd_id_seq", allocationSize=1)
   @Column(name="id, nullable = false)
   private Long id = null;
   
   @Column(name="anzahlTitel", nullable=false)
   private int anzahlTitel;
   
   @ManyToMany
   @JoinTable(name="cd_interpreten",
   joinColumns=@JoinColumn(name="cd_fk"),
   inverseJoinColumns=@JoinColumn(name="interpret_fk"))
   @OrderBy("id ASC")
   private List<Interpret> interpreten;

   public Cd() {
      super();
   }
   
   //GETTER
   
   //SETTER
   
   //@Override toString(), getHashCode(), equals()
```


----------



## byte (21. Jul 2009)

Wenn Du nur JOIN im HQL schreibst, dann entscheidet imo Hibernate selbst, ob er das in ein SQL INNER JOIN oder LEFT JOIN übersetzt.

Das FETCH bedeutet, dass die entsprechenden Daten auch als Java Objekte von Hibernate angelegt werden. Wenn Du also das FETCH weglässt, dann kannst Du Dich zwar im HQL auf die Daten beziehen (z.B. wie in Deinem WHERE mit i.name = ?), aber in den CD-Objekten sind die Interpreten dann nicht initialisiert (also lazy).


----------



## damien (21. Jul 2009)

Alles klar, dann wäre ein LEFT JOIN FETCH hier wohl für mich die bessere Wahl, vielen Dank !


----------

