2009-05-28 29 views
1

適切に(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の1行とでたCurrencyTableを参照CurrencyTableRateで3行がありますデータベース。

私はHQLを使用したCurrencyTableをロードする場合:

from CurrencyTable where refCode = :refCode 

を私はrateMapに3つのエントリを持つエンティティを取得しますが、私はこのしようとした場合:

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

をrateMapで唯一のエントリがあります。

私はHibernateで生成されたクエリを見て手動で実行しました。予想どおり3行を返したので、フェッチした後にマッピングすると問題があるようです。誰かがこのような問題に遭遇しましたか? 私はHibernateバージョン3.2.6.gaとOracle 10gを使用します

答えて

0

まず、refCodeに別名を追加することをお勧めします。私はそれが結果に影響するとは思っていませんが、ちょうどその場合のためです。

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

次に、SQLコードをオンにして、実際にSQLレベルで実行されていることを分析します。私はこのような場合にはHQLと同様の問題を持っていた私は

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) 

に書き換える必要はあり

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

は私のヒントが役立つことを願っています。

+0

エイリアスを追加しましたが、影響はありませんでした。私が質問で書いたように、私はHibernateによって生成されたSQLクエリを見て、手動で実行しました - 期待通りに3行を返しました。最初のクエリを実行し(外部結合フェッチを残さずに)、マップ上でHibernate.initializeを呼び出すことで回避策を使用しました。それが私の仕事であるので、何が起こっているのかを知るためにHibernateをデバッグする時間はありませんが、そのような動作は私を混乱させます:-) –

関連する問題