Spring Data JPA 查询数据库时,如果两个表有关联,那么就设个外键,在查询的时候用Specification创建Join 查询便可。但是只支持左连接,不支持右连接,虽说左右连接反过来就能实现一样的效果,但是这就关系到谁是谁的外键的问题。外键搞起来有时候确实麻烦。所以为了查询个视图,没有找到更好的办法,只好在service层查两次合并起来了。

两个实体类:

@Entity
@Table(name="tb_user")
public class UserInfo implements Serializable{ @Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long userId;
private String userName;
private String password;
private String name;
private int age;
private String sex;
private String email;
private Date dateOfBirth;
private String telNumber;
private String education;
private String school;
// @ManyToOne
// @JoinColumn(name="addressId")
// private Address address;
private Long addressId;
// getter and setter
}
@Entity
@Table(name="tb_address")
public class Address implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long addressId;
   private Long userId 
private String areaCode;
private String country;
private String province;
private String city;
private String area;
private String detailAddress;
// getter and setter
}

创建一个类包含UserInfo和Address中的所有属性:

public class ViewInfo implements Serializable{

    private UserInfo userInfo;
private Address address;
public ViewInfo(){ }
public ViewInfo(UserInfo userInfo){
Address address = new Address();
this.userInfo = userInfo;
this.address = address;
}
public ViewInfo(Address address){
UserInfo userInfo = new UserInfo();
this.userInfo = userInfo;
this.address = address;
}
public ViewInfo(UserInfo userInfo,Address address){
this.userInfo = userInfo;
this.address = address;
}
// getter and setter
}

接下来就是在DAO层中写自定义查询语句了:

public interface UserInfoRepository extends CrudRepository<UserInfo, Long>{
@Query(value="SELECT new com.demo.test.Entity.ViewInfo(u,a)FROM "
+ " UserInfo u, com.demo.test.Entity.Address a WHERE u.addressId = a.id) ")
List<ViewInfo> findViewInfo();
@Query("SELECT new com.demo.test.Entity.ViewInfo"
+ "(u) FROM UserInfo u WHERE u.addressId IS NULL OR u.addressId NOT IN (SELECT a.id FROM Address a)")
List<ViewInfo> findViewInfoLeft();
@Query("SELECT new com.demo.test.Entity.ViewInfo"
+ "(a) FROM Address a WHERE a.id NOT IN (SELECT u.addressId FROM UserInfo u WHERE u.addressId IS NOT NULL)")
List<ViewInfo> findViewInfoRight(); }

然后在service层中查询各个部分:

    public void summary(){
System.out.println("=======middle part=======");
List<ViewInfo> userInfos = userInfoRepository.findViewInfo();
for(ViewInfo item : userInfos){
System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());
}
System.out.println("=======left part=======");
List<ViewInfo> userInfoLeft = userInfoRepository.findViewInfoLeft();
for(ViewInfo item : userInfoLeft){
System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());
}
System.out.println("=======right part=======");
List<ViewInfo> userInfoRight = addressRepository.findViewInfoRight();
for(ViewInfo item : userInfoRight){
System.out.println(item.getUserInfo().getUserName()+" "+item.getAddress().getCity());
} }

数据库的Inner Join选交集,Outer Join 选并集,Left Join 选左表与右表的差集加上交集,Right Join选右表与左表的差集加上交集。暂且如此了。如果哪位看到我的文章有更好的方法请不吝赐教。

Spring Data JPA 多个实体类表联合视图查询的更多相关文章

  1. Spring Data Jpa系列教程--------实体解析和关联关系

    Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...

  2. spring data jpa封装specification实现简单风格的动态查询

    github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...

  3. Spring Data JPA例子[基于Spring Boot、Mysql]

    关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...

  4. 【Spring】Spring Data JPA

    原始JDBC操作数据库 传统JDBC方式实现数据库操作 package com.imooc.util; import java.io.InputStream; import java.sql.*; i ...

  5. Spring Data JPA简单使用

    用Spring Data JPA操作数据库 这份教程教你用Spring Data JPA从关系数据库mysql中存储和提取数据.总结来自https://spring.io/guides/gs/acce ...

  6. Spring data jpa中Query和@Query分别返回map结果集

    引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...

  7. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

    前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

  8. Spring Data JPA教程, 第三部分: Custom Queries with Query Methods(翻译)

    在本人的Spring Data JPA教程的第二部分描述了如何用Spring Data JPA创建一个简单的CRUD应用,本博文将描述如何在Spring Data JPA中使用query方法创建自定义 ...

  9. spring data jpa 利用@Query进行查询

    参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...

随机推荐

  1. hdoj 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心部分背包】

    悼念512汶川大地震遇难同胞——老人是真饿了 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  2. 在SQL Server 2012中如何使用分组集

    作者:Itzik Ben-Gan  翻译:张洪举 此文摘自作者的<Microsoft SQL Server 2012 T-SQL基础>. 分组集就是你据以分组的一个属性集.传统上,SQL中 ...

  3. [CF 351B]Jeff and Furik[归并排序求逆序数]

    题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...

  4. VMware workstation12 pro安装Ubuntu14.04LTS过程笔记

    由于近期需要加强自己在Linux/C++编程方面的需要,把原来的CentOS6.5格了....在windows8.1系统上重新安装了VMware和Ubuntu... VMware安装Ubuntu的过程 ...

  5. 3proxy 二级代理配置样例

    适应情况: 有时,我们的机器HOST-A只能通过代理服务器HOST-B才可以访问internet, 而与我们相连的机器HOST-C也需要访问internet, 但是HOST-C却不能直接访问HOST- ...

  6. [notes] ImageNet Classification with Deep Convolutional Neual Network

    Paper: ImageNet Classification with Deep Convolutional Neual Network Achievements: The model address ...

  7. 检查Oracle 中死事务的语句

    SQL> SELECT KTUXEUSN, KTUXESLT, KTUXESQN, /* Transaction ID */ 2 KTUXESTA Status, KTUXECFL Flags ...

  8. /var/log目录下的20个Linux日志文件功能详解 分类: 服务器搭建 linux内核 Raspberry Pi 2015-03-27 19:15 80人阅读 评论(0) 收藏

    如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...

  9. MySQL的优化点总结---通过计算多种状态的百分比看MySQL的性能情况

    1 读写比例: show global status like 'com_select';  获得服务器启动到目前查询操作执行的次数:show global status like 'com_inse ...

  10. 支付宝手机网站支付流程(Node实现)

    前言 公司M站要接入支付宝,借机研究了一下支付宝的支付流程.毕竟,只有公司才能拿到支付接口权限. 主要参考文档: https://doc.open.alipay.com/doc2/detail?tre ...