部门表是有上下级关系的,建立如下:
CREATE TABLE `sys_dept` (
`dept_id` bigint(20) NOT NULL AUTO_INCREMENT,
`dept_pid` bigint(20) DEFAULT NULL COMMENT '上级部门ID',
`dept_name` varchar(50) NOT NULL COMMENT '部门名称',
`dept_code` varchar(20) DEFAULT NULL COMMENT '部门编码',
`dept_desc` varchar(1000) DEFAULT NULL COMMENT '部门描述',
PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;
实体表和数据表一一对应。
现在的业务是:页面上除了要显示表的基本信息外还要再加上其上级部门名称。
后台使用Spring Data JPA来写的,但是总是报错,不能够识别第二个部门实体。
select com.vo.DeptVo(t2.deptName,t1) from SysDept as t1 left outer join SysDept as t2 where t1.deptPid=t2.deptId
报错信息如下:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [select new com.vo.DeptVo(t2.deptName,t1) from cn.entity.SysDept as t1 left outer join SysDept as t2 where t1.deptPid=t2.deptId
MenuVo是一个VO表,用于存储检索信息的。
找不到第二个SysDept的实体路径。
如果写成如下格式是没有问题的,但是不能显示父ID为空的那条记录
select com.vo.DeptVo(t2.deptName,t1) from SysDept as t1 ,SysDept as t2 where t1.deptPid=t2.deptId
如果是关联其他表示没有问题的,但是关联自身就有问题了,请问该如何解?
把你的实体类贴上来啊 jpa join 是join 字段的 不是表名
<p><a target="_blank" rel="nofollow">@yysf</a></p>
实体如下:
@Entity public class SysDept implements Serializable { private static final long serialVersionUID = 1L; private long deptId; private Long deptPid; private String deptName; private String deptCode; private String deptDesc; // getter、setter }
DeptVo如下:
public class DeptVo implements Serializable { private static final long serialVersionUID = 1L; private String deptPName; private SysDept sysDept; public DeptVo(String deptPName, SysDept sysDept) { this.deptPName = deptPName; this.sysDept = sysDept; } // getter、setter }
<pre><code>public class SysDept implements Serializable {
private static final long serialVersionUID = 1L;
private long deptId;
@Column(insertable = false,updatable = false)
private Long deptPid;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "deptPid")
private SysDept parent;
private String deptName;
private String deptCode;
private String deptDesc;
// getter、setter
}
select com.vo.DeptVo(t2.deptName,t1) from SysDept as t1 le'f't join t1.parent as t2
手写的 没有测试 你试试。
如果要按照你那样写,需要使用原生的sql来实现 。jpa不能那么写
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。