Hibernate Criteria左连接两个表

时间:2011-02-10 19:51:40

标签: java sql hibernate criteria left-join

我有两个实体,比如商业和区域。

相关属性:
业务 - 区域,区域2,代码
面积 - areaId,areaName

商业地图的区域和区域2到区域中的ID

我正在尝试编写一个Hibernate标准,该标准仅返回所有业务领域。

SQL看起来像: 在a.areaId = b.area或a.areaId = b.area2的区域a LEFT OUTER JOIN business b WHERE b.code!= null GROUP BY a.areaName

这就是我所拥有的:

DetachedCriteria criteria = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area"))
.setProjection(Property.forName("area2"))
.add(Restrictions.ne("code", null));

Criteria criteriaArea = fullTextSession.createCriteria(Area.class)
.createAlias("areaId", "areaId", CriteriaSpecification.LEFT_JOIN)
.add(Property.forName("areaId").in(criteria));

但这不起作用,我得到一个“not an association:areaId”查询异常。

为什么会发生这种情况?感谢。

1 个答案:

答案 0 :(得分:5)

createAlias()使用提供的属性加入另一个实体。 Hibernate使用提供的属性的映射来计算要连接的表。但areaId未映射为对Business实体的@ManyToOne@ManyToMany引用。所以Hibernate不了解你想使用Area.areaId加入哪个表。

您的条件将转换为SQL,如:

select a.* from Area a
left join <here should be table referenced by areaId> b on a.areaId = b.id
where a.areaId in (
  select area, area2 from Business where code <> null
)

您可以在没有未使用的连接的情况下重写查询:

DetachedCriteria criteria1 = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area"));

DetachedCriteria criteria2 = DetachedCriteria.forClass(Business.class)
.setProjection(Property.forName("area2"));

Criteria criteriaArea = fullTextSession.createCriteria(Area.class)
.add(Restrictions.or(
  Property.forName("areaId").in(criteria1),
  Property.forName("areaId").in(criteria2)
);