2009-05-28 8 views
1

Ich habe Klassen bekam mit Zuordnungen wie folgt aus:LEFT OUTER JOIN holen nicht richtig Kartensammlung füllen (HQL)

@Entity 
public class CurrencyTable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Version 
    @Column(nullable=false) 
    private Timestamp version; 

    @Column(length=32, unique=true) 
    private String refCode; 

    @OneToMany(mappedBy="currencyTable", fetch=FetchType.LAZY, cascade = {CascadeType.ALL}) 
    @MapKey(name="currency") 
    private Map<String, CurrencyTableRate> rateMap = new HashMap<String, CurrencyTableRate>(); 
} 

@Entity 
public class CurrencyTableRate{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private Long id; 

    @Version 
    @Column(nullable=false) 
    private Timestamp version; 

    @Column(length=3) 
    private String currency; 

    @Basic 
    private BigDecimal rateValue; 

    @ManyToOne(optional=false,fetch=FetchType.LAZY) 
    private CurrencyTable currencyTable; 
} 

Es gibt eine Zeile in Currency und drei Reihen in CurrencyTableRate auf die Currency Bezug auf Datenbank.

Wenn ich laden Currency mit HQL:

from CurrencyTable where refCode = :refCode 

ich eine Einheit mit drei Einträgen in rateMap bekommen, aber wenn ich das versuchen:

from CurrencyTable table left outer join fetch table.rateMap where refCode = :refCode 

gibt es nur einen Eintrag in rateMap.

Ich schaute auf Abfrage generiert von Hibernate und führte es manuell - es gab drei Zeilen, wie erwartet, so scheint es ein Problem mit dem Mapping sie nach dem Abrufen sein. Hat jemand solch ein Problem gelöst? Ich benutze Hibernate Version 3.2.6.ga und Oracle 10g

Antwort

0

Zuerst empfehle ich Ihnen, einen Alias ​​zu refCode hinzuzufügen. Ich denke nicht, dass es Auswirkungen auf das Ergebnis haben wird, aber nur für den Fall.

from CurrencyTable table left outer join fetch table.rateMap where table.refCode = :refCode 

Zweitens, schalten Sie Ihren SQL-Code ein und analysieren Sie, was wirklich auf SQL-Ebene vor sich geht. Ich hatte ähnliche Probleme mit HQL in solchen Fällen

from CurrencyTable table left outer join fetch table.rateMap map where map.id = :id 

, die ich neu schreiben zu

from CurrencyTable table left outer join fetch table.rateMap map where EXISTS (SELECT a.id from CurrencyTable table a INNER JOIN a.rateMap m WHERE m.id = :id and table.id=a.id) 

meine Hinweise Hoffnung helfen.

+0

Ich habe Aliase hinzugefügt und es hatte keine Auswirkungen. Wie ich in Frage schrieb, schaute ich auf SQL-Abfrage, die von Hibernate erzeugt wurde, und führte es manuell aus - es gab wie erwartet drei Zeilen zurück. Ich habe eine Problemumgehung mit dem Ausführen der ersten Abfrage (ohne das Abrufen des linken äußeren Joins) und dem anschließenden Aufrufen von Hibernate.initialize auf der Karte verwendet. Da es in meiner Arbeit ist, habe ich keine Zeit, Hibernate zu debuggen, um herauszufinden, was vor sich geht, aber ein solches Verhalten stört mich :-) –

Verwandte Themen