[英]Hibernate Criteria Left Joining Two Tables
我有两个实体,比如商业和区域。
相关属性:
业务 - 区域,区域2,代码
面积 - areaId,areaName
区域和区域2的业务地图到区域中的ID
我正在尝试编写一个Hibernate标准,该标准仅返回所有业务领域。
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
这就是我所拥有的:
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));
但这不起作用,我得到一个“不是关联:areaId”查询异常。
任何想法为什么会这样? 谢谢。
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)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.