HIbernate为MySQL生成多个连接(对多对多)的错误查询

yoz*_*ozh 5 java mysql hibernate

我遇到了Hibernate + MySQL的麻烦.最初问题出现在我们开发的系统中,后来我设法在小型测试项目中重现它.

因此,有4个实体:人,事件,城市,货币.除货币之外的每个实体与下一个实体具有多对多的单向关系:人有很多事件,事件有很多城市,城市有很多货币.Hibernate配置通过注释完成.

这就是城市的样子,其他实体以同样的方式构建.

@Entity
@Table(name = "CITY")
public class City {
    private Long id;
    private String name;
    private Set<Currency> currencies = new HashSet<Currency>();

    // setters, getters...

    @ManyToMany
    @JoinTable(name = "CITY_CURRENCY", 
            joinColumns = @JoinColumn(name="CITY_ID"),
            inverseJoinColumns = @JoinColumn(name="CURRENCY_ID"))
    public Set<Currency> getCurrencies() {
        return currencies;
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,现在到了这一点.假设,我想获取有关人员的所有信息,即查询所有表,将他们与从Person开始的左连接一起加入.

这种情况的HQL查询如下所示:

from Person as person 
left outer join person.events as event
left outer join event.cities as city 
left outer join city.currencies as currency
Run Code Online (Sandbox Code Playgroud)

这很有效.但我们使用标准,所以我使用条件API编写类似的(我认为)查询:

Criteria crit = session.createCriteria(Person.class, "person");
crit.createAlias("person.events", "event", Criteria.LEFT_JOIN);
crit.createAlias("event.cities", "city", Criteria.LEFT_JOIN);
crit.createAlias("city.currencies", "currency", Criteria.LEFT_JOIN);

crit.setProjection(
    Projections.projectionList()
        .add(Property.forName("person.firstname"), "name")
        .add(Property.forName("event.title"), "event")
        .add(Property.forName("city.name"), "city")
        .add(Property.forName("currency.name"), "currency")
);
Run Code Online (Sandbox Code Playgroud)

但是此代码失败,并在"字段列表"中显示错误"未知列'currency3_.name'".发生的事情是Hibernate不生成最后一个JOIN语句.以下是根据条件生成的查询:

select this_.firstname as y0_, event1_.title as y1_, city2_.name as y2_, 
currency3_.name as y3_ from Person this_ 
left outer join PERSON_EVENT events5_ on this_.PERSON_ID=events5_.PERSON_ID 
left outer join Event event1_ on events5_.EVENT_ID=event1_.EVENT_ID 
left outer join EVENT_CITY cities7_ on event1_.EVENT_ID=cities7_.EVENT_ID 
left outer join CITY city2_ on cities7_.elt=city2_.CITY_ID 
left outer join CITY_CURRENCY currencies9_ on city2_.CITY_ID=currencies9_.CITY_ID
Run Code Online (Sandbox Code Playgroud)

如您所见,没有JOIN到CURRENCY表.很奇怪,是吗?

这种情况特别发生在MySQL,在HSQLDB上,以前的代码运行正常.这不会发生在实体数量较少的情况下,只有四个或更多实体(五个实体查询在同一点"切割").

问题是:我做错了什么?可以做些什么来解决这个问题?我最感兴趣的是这个bug的性质(是我还是Hibernate?).当然,如果这确实是HB bug,那么我将不得不分开查询,使用HQL或其他任何东西.

[CLOSED] 似乎Hibernate社区已经意识到这个错误并将其修复为最新且最好的.从3.5.1更改为3.6.3并且错误消失了.