我有两个实体,例如“业务”和“区域”。
相关属性:
业务-区域,区域2,代码
区域-区域编号,区域名称
业务的area和area2映射到Area中的id
我正在尝试编写一个仅返回企业所有区域的Hibernate标准。
SQL看起来像:
在a.areaId = b.area或a.areaId = b.area2上从区域a左外加入业务b
WHERE b.code!=空
按地区名称分组
这就是我所拥有的:
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
并未映射为对业务实体的@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)
);