这两天开了一个新项目,使用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. OAID 文档与获取DemoAPK

    OAID 查看器 接入 OAID SDK 的 Demo 工程 完整项目地址 Github 文档与 Demo 下载 release 提供 APK 下载 支持设备见 说明文档 常见问题见 F&Q文 ...

  2. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  3. 【粉丝问答10】C语言关键字static的使用详解

    视频地址:https://www.ixigua.com/6935761378816819748 粉丝提问 粉丝问题,总结一下: 关键字static的使用方法. 要想搞清楚关键字static的使用方法, ...

  4. django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions impo ...

  5. 初识Java多线程

    一.多线程概述 1.1.程序.进程.线程概念 1)程序 是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象. 2)进程 是指一个内存中运行的应用程序,每个进程都有一个独立的 ...

  6. CF1149C Tree Generator™

    一.题目 点此看题 二.解法 话说老师给的课件是错的啊,把我坑了好久,我手玩样例才玩出来,最后只能去看洛谷题解了. 本题是树是用一个括号序列给出的,你要知道的是:( 代表递归下去到一个新节点,) 表示 ...

  7. Codeforces Round #575 (Div. 3) D2. RGB Substring (hard version) 【递推】

    一.题目 D2. RGB Substring (hard version) 二.分析 思路一开始就想的对的,但是,用memset给数组初始化为0超时了!超时了! 然后我按照题解改了个vector初始化 ...

  8. 在Ubuntu上安装TensorFlow-GPU开发环境

    深度学习是一个比较复杂的体系,今天记录一下开发环境的搭建步骤. 全新安装Ubuntu 20.10,系统默认安装的是python3,查看python的版本: mango@ubuntu:~$ python ...

  9. 【DB宝45】MySQL高可用之MGR+Consul架构部署

    目录 一.MGR+Consul架构简介 二.搭建MGR 2.1.申请3台MGR机器 2.2.3台主机安装MySQL环境 2.3.修改MySQL参数 2.4.重启MySQL环境 2.5.安装MGR插件( ...

  10. day-04-列表

    列表的初识 容器型数据类型,可以承载大量的数据,有序的数据 why:int bool str:'123 True 太白' str: 存储少量的数据. str:切片还是对其进行任何操作,获取的内容全都是 ...