2

我有这样的映射类:

@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 行,CurrencyTableRate 中有 3 行引用数据库中的 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

4

1 回答 1

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)

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

于 2009-05-28T14:30:41.653 回答