Java HIbernate为MySQL生成了多个连接(多对多)的错误查询
我在使用Hibernate+MySQL时遇到问题。最初问题出现在我们开发的系统中,后来我设法在小型测试项目中重现它 因此,有4个实体:人、事件、城市、货币。除了货币,每个实体与下一个实体都有多对多单向关系:人有许多事件,事件有许多城市,城市有许多货币。Hibernate配置是通过注释完成的 这就是城市的外观,其他实体也是以同样的方式构建的Java HIbernate为MySQL生成了多个连接(多对多)的错误查询,java,mysql,hibernate,Java,Mysql,Hibernate,我在使用Hibernate+MySQL时遇到问题。最初问题出现在我们开发的系统中,后来我设法在小型测试项目中重现它 因此,有4个实体:人、事件、城市、货币。除了货币,每个实体与下一个实体都有多对多单向关系:人有许多事件,事件有许多城市,城市有许多货币。Hibernate配置是通过注释完成的 这就是城市的外观,其他实体也是以同样的方式构建的 @Entity @Table(name = "CITY") public class City { private Long id; priv
@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;
}
}
这是有效的。但是我们使用criteria,所以我正在使用criteria 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")
);
但此代码失败,错误为“字段列表”中的“未知列”currency3\uu3.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
正如您所看到的,并没有连接到货币表。奇怪吧
这是MySQL特有的情况,在HSQLDB上,前面的代码运行良好。
实体数较少时不会出现这种情况,只有四个一个或四个以上(五个实体在同一点上查询为“切割”)
问题是:我做错了什么?如何解决这个问题?
我最感兴趣的是这个bug的本质(是我还是冬眠?)。当然,如果这确实是HB错误,那么我将不得不单独查询,使用HQL或其他任何东西
[关闭]
Hibernate社区似乎意识到了这个bug,并在最新和最好的版本中修复了它。从3.5.1更改为3.6.3,bug消失了。您尝试过在MySQL Workbench中运行查询吗?我发现当面对这种问题时,这是最好的办法。你是说实际的SQL查询?当然,实际上是在命令提示符下。
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