Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将两个表连接在一起的Hibernate条件_Java_Sql_Hibernate_Criteria_Left Join - Fatal编程技术网

Java 将两个表连接在一起的Hibernate条件

Java 将两个表连接在一起的Hibernate条件,java,sql,hibernate,criteria,left-join,Java,Sql,Hibernate,Criteria,Left Join,我有两个实体,比如业务和区域 相关属性: 业务-区域,区域2,代码 区域-区域ID,区域名称 区域和区域2到区域id的业务地图 我正在尝试编写一个Hibernate标准,它只返回所有具有业务的区域 SQL看起来像: 从a区左外侧加入a.areaId=b.area或a.areaId=b.area2上的业务b b.code!=无效的 按a.areaName分组 这就是我所拥有的: DetachedCriteria criteria = DetachedCriteria.forClass(Busine

我有两个实体,比如业务和区域

相关属性:
业务-区域,区域2,代码
区域-区域ID,区域名称

区域和区域2到区域id的业务地图

我正在尝试编写一个Hibernate标准,它只返回所有具有业务的区域

SQL看起来像: 从a区左外侧加入a.areaId=b.area或a.areaId=b.area2上的业务b b.code!=无效的 按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
未映射为对业务实体的
@ManyToOne
@ManyToOne
引用。所以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
)

小提示:使用Restrictions.isNotNull(“代码”)。在某些数据库中,“null”不同于“is not null”。您是否将关系放入实体定义中?(xml或注释)
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)
);