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. Spring3 M2 quartz-2.1.7 解决bean不能注入问题

    我们要达到这样的效果 public class CancelUnpaidOrderTask implements Job { @Autowired private AppOrderService or ...

  2. NET设计模式-单例模式(Singleton Pattern)

    1. 概述 Singleton Pattren 要求一个类有且仅有一个实例,并且提供一个全局变量.这个创建的对象是独一无二的,在这个单独对象实例中,集中所创建类的所有属性和方法. 在创建一个单例,何时 ...

  3. (一)Windows下搭建PHP开发环境及相关注意事项

    PHP集成开发环境有很多,如XAMPP.AppServ......只要一键安装就把PHP环境给搭建好了.但这种安装方式不够灵活,软件的自由组合不方便,同时也不利于学习.所以我还是喜欢手工搭建PHP开发 ...

  4. Asp.net网站后台代码不能访问-iis部署

    最近自己写了点东西,部署的时候确发生了点问题,后台代码访问不了,错误为:由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.   错误详细提示: HTTP 错误 404.3 -  ...

  5. sencha touch 框架的几种核心脚本文件之间的区别

    sencha-touch-debug.js      供开发时用sencha-touch.js   供发布时用sencha-touch-all.js All     供不能使用SDK构建应用程序时,将 ...

  6. 另5个你不知道的HTML5接口API

    原文地址: 5 More HTML5 APIs You Didn’t Know Existed 演示地址: 全屏API Demo 原文日期: 2012年11月08日 翻译日期: 2013年08月13日 ...

  7. Android如何创建背景透明的Dialog

    一:控制Dialog 的背景方法:1.定义一个无背景主题主题<!--去掉背景Dialog--> <style name="NobackDialog" parent ...

  8. Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用

    在HTML5游戏开发中,js可以使用Event对象的addEventListener(添加事件监听).dispatchEvent(触发事件)实现监听机制,如果在coocos2d-x中,去实现这种机制该 ...

  9. json-lib-2.4-jdk15.jar maven

    最近自己将一个web项目装换到使用mevan自动管理. 遇到了一个json包导入的问题.最终解决如下: <!-- https://mvnrepository.com/artifact/net.s ...

  10. 最近的两个小项目,2:Python webapp的docker镜像

    时间过得真快,一眨眼一个多月没更新了,但这一个月我可没偷懒啊,真的是忙.粘上两篇ReadMe勉强凑合一下,保持博客更新是好习惯. 基于Flask框架,uwsgi起服务,supervisor做管理,应该 ...