2009-05-28 44 views
1

我有個教學班,映射是這樣的:LEFT OUTER JOIN獲取未正確填入地圖收集(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; 
} 

有在CurrencyTable一行和三排CurrencyTableRate指CurrencyTable在數據庫。

當我加載CurrencyTable使用HQL:

from CurrencyTable where refCode = :refCode 

我得到的rateMap三個項目的實體,但如果我試試這個:

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

只有一個在rateMap條目。

我查看了Hibernate生成的查詢,並手動運行它 - 它按預期的方式返回了三行,因此它在提取後映射它們似乎有問題。有沒有人囚禁過這樣的問題? 我使用休眠版本3.2.6.ga和Oracle 10g

回答

0

首先,我建議你添加一個別名到refCode。我認爲這不會對結果產生影響,但以防萬一。

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

其次,打開您的SQL代碼並分析SQL級別的真實情況。我在這樣的情況下

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

,我不得不重寫

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) 

希望我的提示將幫助HQL類似的問題。

+0

我添加了別名,它沒有影響。正如我寫的問題,我查看了由Hibernate生成的SQL查詢並手動運行它 - 它按預期返回了三行。我使用了一個解決方法,先運行第一個查詢(沒有離開外部聯接提取),然後在地圖上調用Hibernate.initialize。因爲它在我的工作中,所以我沒有時間去調試Hibernate來了解發生了什麼,但是這樣的行爲讓我感到不安:-) – 2009-05-29 08:15:32