我有两个实体,比如商业和区域。
相关属性:
业务 - 区域,区域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”查询异常。
为什么会发生这种情况?感谢。
答案 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)
);