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. Mondriaan's Dream - POJ 2411(状态压缩)

    题目大意:有一些1*2的矩形,现在用这些小矩形覆盖M*N的大矩形,不能重复覆盖,并且要覆盖完全,求有多少种覆盖方式. 分析:可以使用1和0两种状态来表示这个位置有没有放置,1表示放置,0表示没有放置, ...

  2. linux驱动开发之HelloWorld

    最近实习,公司项目搞的是平板开发,而我分配的任务是将驱动加载到内核中. 准备工作,必要知识了解:加载有两种方式,一种是动态加载和卸载即模块加载,另一种是直接编译进入内核:Linux内核把驱动程序划分为 ...

  3. 基于Lucene3.5.0怎样从TokenStream获得Token

    通过学习Lucene3.5.0的doc文档,对不同release版本号 lucene版本号的API修改做分析.最后找到了有价值的修改信息. LUCENE-2302: Deprecated TermAt ...

  4. [RxJS] Filtering operators: takeUntil, takeWhile

    take(), takeLast(), first(), last(), those opreators all take number or no param. takeUtil and takeW ...

  5. java继承分析

    把java学完之后有開始了一遍突然发现对于继承还是不太理解所以就做了一个測试来分析一下 <span style="font-size:18px;">class A{ p ...

  6. Windows如何打包Qt程序

    很多Qt爱好者想发布自己的Qt软件,但却发现在其他没有安装Qt SDK的机器上无法运行,这就是本文想要说明的问题.现在网上大部分软件都要发布自己开发的应用程序,都会打包到exe文件中,待安装完exe文 ...

  7. java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang.String 转载

    java.sql.SQLException: Invalid parameter object type. Expected 'java.util.Map' but found 'java.lang. ...

  8. SQLite查询优化性能要点

    Sqlite是轻量级的,在编译之后很小,其中一个原因就是在查询优化方面比较简单,它只是运用索引机制来进行优化的,经过对SQLite的查询优化的分析以及对源代码的研究,我将SQLite的查询优总结如下: ...

  9. 【转载】ASP.NET支持多语言

    ASP.NET 2.0中实现:1.使用工具自动生成本地化资源(LocalResources) 首先建立一个WEB工程,如图所示:双击Default.aspx,切换到[设计]视图,从工具箱里拖一个But ...

  10. hibernate之增删改查demo

    package dao; import java.util.ArrayList; import java.util.List; import org.hibernate.Query; import o ...