左外连接提取未正确填充地图集合(HQL)

时间:2009-05-28 11:06:55

标签: hibernate join map one-to-many

我有这样的映射类:

@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。

当我使用HQL加载CurrencyTable时:

from CurrencyTable where refCode = :refCode

我在rateMap中获得了一个包含三个条目的实体,但是如果我尝试这个:

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

在rateMap中只有一个条目。

我查看了Hibernate生成的查询并手动运行 - 它按预期返回了三行,因此在获取后映射它们似乎是一个问题。有没有人遇到过这样的问题? 我使用Hibernate版本3.2.6.ga和Oracle 10g

1 个答案:

答案 0 :(得分: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 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)

希望我的提示能有所帮助。