我有两个实体,例如“业务”和“区域”。

相关属性:
业务-区域,区域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)
);

10-01 04:54