2017-04-27 1 views
1

J'ai une tâche pour transformer les jointures externes gauche en jointures internes. J'ai travaillé avec Hibernate. je entités:Hibernate Inner join à la place left outter

@Entity 
@Table("entity1") 
public Entity1{ 
@Id 
private Integer id; 

@ManyToOne(fetch = FetchType.EAGER) 
private Entity2 field; 
} 

@Entity 
@Table("entity2") 
public class Entity2{ 

@Id 
private String name; 

@ManyToOne(fetch = FetchType.EAGER) 
@JoinTable(name = "entity3_entity2", 
      joinColumns = @JoinColumn(name="entity2_name") 
      inverseJoinColumns = @JoinColumn(name = "entity3_name")) 
private Entity3 field; 
} 

@Entity 
@Table("entity3") 
public class Entity3{ 

@Id 
private String name; 

@OneToMany 
private Set<Entity2> field; 
} 

Et je hql:

SELECT e1 FROM Entity1 e1 inner join fetch e1.field e2 inner join fetch e2.field where e1.id = ?1 

Résultat SQL est:

select ... from entity1 inner join entity2 on ... left outer join entity3_entity2 on ... 

Mais je dois chercher les dossiers de entity3 avec jointure interne sans requêtes SQL. Y a-t-il un moyen de le faire?

+0

Hey Alexey, obtenez-vous des lignes en double dans ce scénario? – PSabuwala

Répondre

0

Pour extraire les enregistrements à l'aide de la jointure interne dans hibernate, la requête suivante peut être utilisée.

<query name="findEntities"> 
    <query-param name="id" type="long" /> //pass id to here 
    SELECT e1 FROM Entity1 e1 
     inner join fetch e1.field e2 
     inner join fetch e2.field e3 
    where e1 = :id 
</query> 

Ou

@Query("SELECT e1 FROM Entity1 e1 inner join fetch e1.field e2 inner join fetch e2.field e3 where e1 = ?1") 
+0

J'ai déjà essayé cette requête. Mais le résultat sql était: select ... from entity1 jointure interne entity2 sur ... left jointure externe entity3_entity2 on ... jointure interne entity3 le .... –