这两天开了一个新项目,使用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. python爬虫(正则取数据)读取表格内的基金代码后爬取基金最新净值,同时写到对应的表格中,基于最近一次购买净值计算出涨跌幅(名字有点长)

    最近基金跌的真够猛,虽说是定投,但大幅度下跌,有时候适当的增加定投数也是降低平均成本的一种方式 每天去看去算太费时间,写了个爬虫,让他自动抓数据后自动计算出来吧 实现逻辑: 1.创建了一个excel表 ...

  2. rest framework ViewSet

    ViewSets 路由选择确定要用于一个请求哪个控制器之后,控制器负责做出请求的感并产生相应的输出. - Ruby on Rails的文档 Django的REST框架允许你的逻辑一组在一个类中的相关意 ...

  3. 前端学习 node 快速入门 系列 —— npm

    其他章节请看: 前端学习 node 快速入门 系列 npm npm 是什么 npm 是 node 的包管理器,绝大多数 javascript 相关的包都放在 npm 上. 所谓包,就是别人提供出来供他 ...

  4. github个人主页 阿里云域名的绑定

    域名解析 我在阿里云上买了一个新域名:gaolu.name,我已经在GitHub Pages上建立了自己的博客:http://gaolu1215.github.io.现在我希望将gaolu.name映 ...

  5. Linux Shell 统计一(行\列)数值的总和及行、列转换

    (对一列数字求和) 在日常工作当中需要对文本过滤出来的数字进行求和运算,例如想统计一个MySQL分区表现在有多大 # ls -lsh AdPlateform#P#p*.ibd  |grep G 2.6 ...

  6. python2 虚拟环境

    1.安装virtualenv pip install virtualenv 2.创建虚拟环境 virtualenv 虚拟环境名称  3.激活虚拟环境 source 虚拟环境目录/bin/activat ...

  7. 攻防世界 reverse 进阶 10 Reverse Box

    攻防世界中此题信息未给全,题目来源为[TWCTF-2016:Reverse] Reverse Box 网上有很多wp是使用gdb脚本,这里找到一个本地还原关键算法,然后再爆破的 https://www ...

  8. 在ASP.NET Core中用HttpClient(四)——提高性能和优化内存

    到目前为止,我们一直在使用字符串创建请求体,并读取响应的内容.但是我们可以通过使用流提高性能和优化内存.因此,在本文中,我们将学习如何在请求和响应中使用HttpClient流. 什么是流 流是以文件. ...

  9. pycharm在debug时总是报UnicodeDecodeError

    1,原文链接 解决pycharm run 正常 debug 报 UnicodeDecodeError 错误的问题 2,解决方法 首先尝试 如果上面还不行

  10. 互联网开发工具之idea项目打jar包

    一.idea打jar包 步骤一:创建一个简单的java项目:如下图所示 `public class Main { public static void main(String[] args) { Sy ...