开发者社区> 问答> 正文

Springboot JPA 表实体关联自身的问题?报错

部门表是有上下级关系的,建立如下:

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

如果是关联其他表示没有问题的,但是关联自身就有问题了,请问该如何解?

展开
收起
爱吃鱼的程序员 2020-06-07 16:58:34 910 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        把你的实体类贴上来啊 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不能那么写

    2020-06-07 16:58:49
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多