这两天开了一个新项目,使用SpringBoot+SpringData,  刚做了一个小功能,都是一张表的操作没什么问题,今天设计到了两张表联查,两张表各取了几个字段,组合成了一个vo, 当我用原生sql查询时报出 “找不到转换器”,当我用JPQL查询时,报出 xxx is not mapped.。 着实浪费了些时间。  其实最大的根本原因在于, 当使用JPQL 查询时,我们 FROM 的表名就不能是实体上@Table 注解中的表名,而是对应的实体的类名,记住是类名,并且查询的字段要是 实体类的属性,而不是数据库字段。切记。下面是我的代码

package com.wisdombud.dama.quality.datasource.pojo;

import java.io.Serializable;
import java.util.Date; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotBlank; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.ToString; @Entity
@Table(name = "DATA_SOURCE")
@SequenceGenerator(name = "ID_SEQ", sequenceName = "SEQ_DATA_SOURCE", allocationSize = 1)
@ToString
public class DataSourcePojo implements Serializable{ private static final long serialVersionUID = 4658654420795590006L; private Long id; @NotBlank(message = "数据源名称不能为空!")
private String name; @NotBlank(message = "ip地址不能为空!")
private String ip; @NotBlank(message = "端口号不能为空!")
private String port; @NotBlank(message = "服务名不能为空!")
private String serviceName; @NotBlank(message = "用户名不能为空!")
private String userName; @NotBlank(message = "密码不能为空!")
private String password;
private String managerBranch;
private String leadingCadre;
private String phone;
private Long sortIndex;
private String remark;
private Long createUserId;
private String createUserName; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
private Date lastUpdateTime;
private String re1;
private String re2;
private String re3;
private String re4; @Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 18, scale = 0)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
} @Column(name = "NAME")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @Column(name = "IP")
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
} @Column(name = "PORT")
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
} @Column(name = "SERVICE_NAME")
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
} @Column(name = "USER_NAME")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
} @Column(name = "PASSWORD")
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
} @Column(name = "MANAGER_BRANCH")
public String getManagerBranch() {
return managerBranch;
}
public void setManagerBranch(String managerBranch) {
this.managerBranch = managerBranch;
} @Column(name = "LEADING_CADRE")
public String getLeadingCadre() {
return leadingCadre;
}
public void setLeadingCadre(String leadingCadre) {
this.leadingCadre = leadingCadre;
} @Column(name = "PHONE")
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
} @Column(name = "SORT_INDEX")
public Long getSortIndex() {
return sortIndex;
}
public void setSortIndex(Long sortIndex) {
this.sortIndex = sortIndex;
} @Column(name = "REMARK")
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} @Column(name = "CREATE_USER_ID")
public Long getCreateUserId() {
return createUserId;
}
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
} @Column(name = "CREATE_USER_NAME")
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
} @Column(name = "CREATE_TIME")
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
} @Column(name = "LAST_UPDATE_TIME")
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
} @Column(name = "RE1")
public String getRe1() {
return re1;
}
public void setRe1(String re1) {
this.re1 = re1;
} @Column(name = "RE2")
public String getRe2() {
return re2;
}
public void setRe2(String re2) {
this.re2 = re2;
} @Column(name = "RE3")
public String getRe3() {
return re3;
}
public void setRe3(String re3) {
this.re3 = re3;
} @Column(name = "RE4")
public String getRe4() {
return re4;
}
public void setRe4(String re4) {
this.re4 = re4;
}
}
package com.wisdombud.dama.quality.datasource.tablerelation.pojo;

import java.io.Serializable;
import java.util.Date; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table; import lombok.ToString; /**
* 表关系实体
* @author qiaoyutao
* @Date: 2019年7月4日 上午11:40:10
*/
@Entity
@Table(name = "TABLE_RELATION")
@SequenceGenerator(name = "ID_SEQ", sequenceName = "SEQ_TABLE_RELATION", allocationSize = 1)
@ToString
public class TableRelationPojo implements Serializable{ private static final long serialVersionUID = -9058973373224769393L; private Long id;
private Long dataSourceId;
private String tableName;
private String columnName;
private String relationTableName;
private String relationColumnName;
private String remark;
private Long createUserId;
private String createUserName;
private Date createTime;
private Date lastUpdateTime;
private String re1;
private String re2;
private String re3;
private String re4; @Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ID_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 18, scale = 0)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
} @Column(name = "DATA_SOURCE_ID")
public Long getDataSourceId() {
return dataSourceId;
}
public void setDataSourceId(Long dataSourceId) {
this.dataSourceId = dataSourceId;
} @Column(name = "TABLE_NAME")
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName;
} @Column(name = "COLUMN_NAME")
public String getColumnName() {
return columnName;
}
public void setColumnName(String columnName) {
this.columnName = columnName;
} @Column(name = "RELATION_TABLE_NAME")
public String getRelationTableName() {
return relationTableName;
}
public void setRelationTableName(String relationTableName) {
this.relationTableName = relationTableName;
} @Column(name = "RELATION_COLUMN_NAME")
public String getRelationColumnName() {
return relationColumnName;
}
public void setRelationColumnName(String relationColumnName) {
this.relationColumnName = relationColumnName;
} @Column(name = "REMARK")
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} @Column(name = "CREATE_USER_ID")
public Long getCreateUserId() {
return createUserId;
}
public void setCreateUserId(Long createUserId) {
this.createUserId = createUserId;
} @Column(name = "CREATE_USER_NAME")
public String getCreateUserName() {
return createUserName;
}
public void setCreateUserName(String createUserName) {
this.createUserName = createUserName;
} @Column(name = "CREATE_TIME")
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
} @Column(name = "LAST_UPDATE_TIME")
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
} @Column(name = "RE1")
public String getRe1() {
return re1;
}
public void setRe1(String re1) {
this.re1 = re1;
} @Column(name = "RE2")
public String getRe2() {
return re2;
}
public void setRe2(String re2) {
this.re2 = re2;
} @Column(name = "RE3")
public String getRe3() {
return re3;
}
public void setRe3(String re3) {
this.re3 = re3;
} @Column(name = "RE4")
public String getRe4() {
return re4;
}
public void setRe4(String re4) {
this.re4 = re4;
}
}

下面是我的dao层,重点

package com.wisdombud.dama.quality.datasource.tablerelation.dao;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import com.wisdombud.dama.quality.datasource.tablerelation.pojo.TableRelationPojo;
import com.wisdombud.dama.quality.datasource.tablerelation.vo.TableRelationGridVo; public interface TableRelationDao extends JpaRepository<TableRelationPojo, Long>, JpaSpecificationExecutor<TableRelationPojo>{ // 这里使用JPQL来写的, 区别就是 new 一个vo名,最好带上全路径,并且vo中要有有参构造器,构造器签名要与查询的字段一致, 查询的属性都是实体类中的属性名,不是数据库的字段名,这点切记。
@Query(value = "SELECT new com.wisdombud.dama.quality.datasource.tablerelation.vo.TableRelationGridVo(re.id, "
+ "ds.name, re.tableName, re.columnName, "
+ "re.relationTableName, re.relationColumnName, "
+ "re.createTime) "
+ "FROM TableRelationPojo re left join DataSourcePojo ds on re.dataSourceId = ds.id")
public Page<TableRelationGridVo> page(Pageable pageable); }

希望能够帮到跟我一样因为这一个,加班到9点的你。  转载请注明出处

关于Spring Data JPA 多表查询 返回自定义Vo的问题记录的更多相关文章

  1. jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本

    -----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join).  上代码了 1.我们要联查房屋和房屋用户中间表,通过 ...

  2. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  3. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  4. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  5. Spring data JPA 理解(默认查询 自定义查询 分页查询)及no session 三种处理方法

    简介:Spring Data JPA 其实就是JDK方式(还有一种cglib的方式需要Class)的动态代理 (需要一个接口 有一大堆接口最上边的是Repository接口来自org.springfr ...

  6. Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...

  7. Spring data jpa 调用存储过程处理返回参数及结果集

    一.环境 1.此随笔内容基于spring boot整合的spring data jpa项目, 2.数据库为mysql 5.7.9版本 二.内容 1. 新建存储过程 pro_query_object B ...

  8. spring data jpa 多对多查询

    package com.ytkj.dao; import com.ytkj.entity.Customer; import com.ytkj.entity.Role; import org.sprin ...

  9. spring data jpa 一对多查询

    在一对多关系中,我们习惯把一的一方称之为主表,把多的一方称之为从表.在数据库中建立一对多的关系,需要使用数据库的外键约束. 什么是外键? 指的是从表中有一列,取值参照主表的主键,这一列就是外键. pa ...

随机推荐

  1. Vuex理解与使用

    1.Vuex是什么 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,用于管理页面的数据状态.提供统一数据操作的生态系统.在组件中可以任意获取仓库中的数据.和Vuex类似的还有redux ...

  2. CF1491C Pekora and Trampoline 题解

    题目链接 ​ 比赛时只想到了 \(\mathcal O(n^3)\) 的暴力做法,官方题解是 \(\mathcal O(n^2)\) ,并且是可以优化为 \(\mathcal O(n)\) 的(贪心+ ...

  3. 力扣168. Excel表列名称

    原题 1 class Solution: 2 def convertToTitle(self, n: int) -> str: 3 s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ ...

  4. DES加密详解

    目录 1 根据输入的秘钥得到16个子秘钥 1.1 大致流程 1.2 利用PC-1从K_0中挑出K_1 1.3 利用PC-2从K_1中挑出16个子秘钥 2 利用16个子秘钥对明文进行加密 2.1 大致流 ...

  5. C#正则实现匹配一块代码段

    最近项目,生成聚合网关,但是生成的网关文件中,存在着不必要的代码段,比如一个类A,类B等 之前一直使用手动删除,这么做劳民伤财,浪费时间,考虑使用正则写一个工具实现自动删除. 正则写法: string ...

  6. Percona XtraDB Cluster之流量控制

    什么是流量控制? Percona XtraDB Cluster具有一种称为流控制的自调节机制.该机制有助于避免集群中最弱/最慢的成员明显落后于集群中其他成员的情况. 当集群成员在写数据很慢(同时又继续 ...

  7. redis集群(redis_cluster)

    一.为什么要使用redis-cluster? 1.数据并发问题 2.数据量太大 新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集 ...

  8. 制作API离线chm帮助文件教程

    当我们开发好一个通信库的时候,我们希望给这个通信库配备一个帮助文档,最好的方式,就是有一个离线的chm版本的API文档,这样别人在使用的时候,就可以清楚看到命名空间.类的结构,同时也能看到每个方法和属 ...

  9. frida hook_RegisterNatives--使用frida打印so中动态注册的函数

    原文地址:https://github.com/lasting-yang/frida_hook_libartfrida -U --no-pause -f package_name -l hook_Re ...

  10. 攻防世界 reverse 进阶 8-The_Maya_Society Hack.lu-2017

    8.The_Maya_Society Hack.lu-2017 在linux下将时间调整为2012-12-21,运行即可得到flag. 下面进行分析 1 signed __int64 __fastca ...