J. *_*Lin 3 java sql hibernate criteria left-join
我有两个实体,比如商业和区域.
相关属性:
业务 - 区域,区域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));
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我得到一个"不是关联: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
)
Run Code Online (Sandbox Code Playgroud)
您可以重写查询而不使用未使用的连接:
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)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27250 次 |
| 最近记录: |