简体   繁体   English

Hibernate Criteria左连接两个表

[英]Hibernate Criteria Left Joining Two Tables

I have two entities, say Business and Area. 我有两个实体,比如商业和区域。

Relevant properties: 相关属性:
Business - area, area2, code 业务 - 区域,区域2,代码
Area - areaId, areaName 面积 - areaId,areaName

area and area2 of Business map to the id in Area 区域和区域2的业务地图到区域中的ID

I'm trying to write a Hibernate criteria that returns all the areas with businesses only. 我正在尝试编写一个Hibernate标准,该标准仅返回所有业务领域。

SQL looks like: FROM area a LEFT OUTER JOIN business b on a.areaId = b.area or a.areaId = b.area2 WHERE b.code != null GROUP BY a.areaName SQL看起来像:FROM area a LEFT OUTER JOIN business b on a.areaId = b.area或a.areaId = b.area2 WHERE b.code!= null GROUP BY a.areaName

This is what I have: 这就是我所拥有的:

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));

But this doesn't work, I get a "not an association: areaId" query exception. 但这不起作用,我得到一个“不是关联:areaId”查询异常。

Any ideas why this is happening? 任何想法为什么会这样? Thanks. 谢谢。

createAlias() joins another entity using provided property. createAlias()使用提供的属性连接另一个实体。 Hibernate calculates what table to join using mapping of provided property. Hibernate使用提供的属性的映射来计算要连接的表。 But areaId isn't mapped as a @ManyToOne or @ManyToMany reference to Business entity. 但是areaId未映射为对Business实体的@ManyToOne@ManyToMany引用。 So Hibernate doesn't understand to what table you want to join using Area.areaId. 所以Hibernate不了解你想使用Area.areaId加入哪个表。

Your criteria will be translated to SQL like: 您的条件将转换为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
)

You may rewrite query without unused join: 您可以重写查询而不使用未使用的连接:

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)
);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM