我有这样的映射类:
@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
答案 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)
希望我的提示能有所帮助。