-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: LEFT OUTER JOIN - Spalte in mehr als einer Tabelle gefunden
PostPosted: Thu Apr 22, 2010 8:42 am 
Newbie

Joined: Wed Apr 21, 2010 8:41 am
Posts: 12
Hallo,

bei der Transformation von HQL nach SQL geht der Tabellen-Alias Name verloren und die Datenbank wirft eine
Exception mit der Meldung "Spalte 'STR' in mehr als einer Tabelle gefunden - Korrelationsname erforderlich"

Hier ein leicht vereinfachtes Beispiel:

Meine JPA-Entities:
Code:
@Entity
@Table(name = "ENTITY1")
public class Entity1 {
    @EmbeddedId
    private MyId id;

   @Column(name = "NAME", length = 40, columnDefinition = "char(40)")
    private String name;
   
   @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns( { @JoinColumn(name = "ENTITY1_ID", referencedColumnName = "ID"),
            @JoinColumn(name = "ENTITY1_SECOND_ID", referencedColumnName = "SECOND_ID") })
    private Entity1 entity1;
   
   @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumns( { @JoinColumn(name = "ENTITY2_ID", referencedColumnName = "ID", insertable = false, updatable = false),
            @JoinColumn(name = "ENTITY2_SECOND_ID", referencedColumnName = "SECOND_ID", insertable = false, updatable = false) })
    private Entity2 entity2;
   
   /*Getter und Setter*/
}

Code:
@Entity
@Table(name = "ENTITY2")
public class Entity2 {
    @EmbeddedId
    private MyId id;
   
   @Column(name = "ORT", length = 40, columnDefinition = "char(40)")
    private String ort;
   
    @Column(name = "STR", length = 40, columnDefinition = "char(40)")
    private String str;
   
   /*Getter und Setter*/
}

Code:
@Entity
@Table(name = "ENTITY2")
public class Entity2 {
    @EmbeddedId
    private MyId id;

   @Column(name = "ORT", length = 40, columnDefinition = "char(40)")
    private String ort;
   
   @Column(name = "STR", length = 40, columnDefinition = "char(40)")
    private String str;
   
   /*Getter und Setter*/
}

Meine nicht funktionierende Named Query:
Code:
   <named-query name="Todo.selectAllGlueckwuenscheByBenutzer">
      <query>   
   select new de.myentities.SpecialEntity(
            T.myid.id,
            T.myid.secondId,
            T.name,
               P.ort,
               P.str,
            M.ort,
               M.str)
      FROM Entity1 T
         LEFT OUTER JOIN T.entity2 M
             LEFT OUTER JOIN T.entity3 P
      </query>
   </named-query>
   

Resultierende SQL Query:
Code:
select entity1_.ID as col_0_0_,
      entity1_.SECOND_ID as col_1_0_,
      entity1_.NAME as col_2_0_,
      entity3_.ORT as col_3_0_,
      STR as col_4_0_,
      entity2_.ORT as col_5_0_,
      STR as col_6_0_
      from ENTITY1 entity1_
      left outer join ENTITY2 entity2_
      on entity1_.ENTITY2_SECOND_ID=entity2_.SECOND_ID and entity1_.ENTITY2_ID=entity2_.ID
      left outer join ENTITY3 entity3_
      on entity1_.ENTITY3_SECOND_ID=entity3_.SECOND_ID and entity1_.ENTITY3_ID=entity3_.ID
   

Die Fehlermeldung der Datenbank ist verständlich aber wieso lässt Hibernate den Korrelationsname bei dem Feld "STR" weg und bei dem Feld "ORT" nicht?

Ich habe bereits versucht meinen Fehler durch debuggen zu finden, allerdings konnte ich die eigentliche Transformation von HQL nach SQL nicht debuggen weil mir der Quellcode der Hibernate Klasse org.hibernate.hql.antlr.HqlSqlBaseWalker fehlt.

Jemand eine Idee wieso Hibernate der Meinung sein könnte, dass der Korrelationsname nicht nötig ist?

Grüße,
Jonas

---------------------
Hibernate 3.5.1 Final


Top
 Profile  
 
 Post subject: Re: LEFT OUTER JOIN - Spalte in mehr als einer Tabelle gefunden
PostPosted: Fri Apr 23, 2010 6:20 am 
Newbie

Joined: Wed Apr 21, 2010 8:41 am
Posts: 12
Hallo,

ich habe den Fehler gefunden. "STR" ist unter Sybase und DB2 eine Funktion die Numbers nach Characters konvertiert. Dies veranlasst Hibernate bei der Transformation von HQL nach SQL die Korrelationsnamen wegfallen zulassen. Hört sich für mich nach einem Bug an!?.

Um dieses Verhalten zu verhindern muss der Spaltennamen mit Backticks ` umklammert werden:

@Column(name="`STR`")
String str;

Grüße,
Jonas


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.