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. SPOJ 375 (树链剖分+线段树)

    题意:一棵包含N 个结点的树,每条边都有一个权值,要求模拟两种操作:(1)改变某条边的权值,(2)询问U,V 之间的路径中权值最大的边. 思路:最近比赛总是看到有树链剖分的题目,就看了论文,做了这题, ...

  2. 【大盛】HTC one/M7 ROM 最新本地化OrDroid8.2.6 高级、快速设置 永久root 更多自定义 稳定 流畅

    了解更多:点击下载ROM和学习更多 ROM版本 HTC-one_OrDroid8.2.6 ROM作者 雪狼团队·大盛 http://weibo.com/DaShengdd Android版本 Andr ...

  3. Spring 的注册与注入

    之前和同学老是爱混淆注册与注入.今天再看一遍感觉多了一些理解. 注册就是声明bean.就是让spring能够找到这个bean服务. 注入就是把bean(A)加入到另一个bean(B)的属性中.让另外一 ...

  4. java的任务监听器监听任务

    Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务. 使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少 监听 ...

  5. bzoj3907: 网格

    http://www.cnblogs.com/Tunix/p/4354348.html #include<cstdio> #include<cstring> #include& ...

  6. RichTextBox 右键显示 ContextMenuTrip 分类: C# 2014-10-16 10:43 337人阅读 评论(0) 收藏

    说明: (1)命名: RichTextBox  -> rtxt1 ContextMenuTrip -> cms1 (2)截图: (3)完整代码: <span style=" ...

  7. php 判断数组相等 数组运算符介绍

    如何判断两个数组相等呢?其实很简单,用 == 或者 === 就可以了 php手册里说明如下, 例子 名称 结果 $a + $b 联合 $a 和 $b 的联合. $a == $b 相等 如果 $a 和  ...

  8. c++截取屏幕图片并保存(函数代码实现)

    <strong> //获取桌面窗体的CDC CDC *pdeskdc = GetDesktopWindow()->GetDC(); CRect re; //获取窗体的大小 GetDe ...

  9. 写在新建博客的第一天 分类: fool_tree的笔记本 2014-11-08 17:57 144人阅读 评论(0) 收藏

    来CSDN开博客的目的有两个: 其一是因为CSDN的代码输出,看过一些博文,觉得这里的代码输出真的很漂亮: 其二则是因为,感觉自己印象笔记用久了之后,渐渐地几乎不再自己写些东西了,习惯了方便的剪藏插件 ...

  10. hibernate Java 时间和日期类型的 Hibernate 映射

    基础知识: 在 Java 中, 代表时间和日期的类型包含: java.util.Date 和 java.util.Calendar. 此外, 在 JDBC API 中还提供了 3 个扩展了 java. ...