Spring Data JPA 多个实体类表联合视图查询
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 多个实体类表联合视图查询的更多相关文章
- Spring Data Jpa系列教程--------实体解析和关联关系
Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...
- spring data jpa封装specification实现简单风格的动态查询
github:https://github.com/peterowang/spring-data-jpa-demo 单一实体的动态查询: @Servicepublic class AdvancedUs ...
- Spring Data JPA例子[基于Spring Boot、Mysql]
关于Spring Data Spring社区的一个顶级工程,主要用于简化数据(关系型&非关系型)访问,如果我们使用Spring Data来开发程序的话,那么可以省去很多低级别的数据访问操作,如 ...
- 【Spring】Spring Data JPA
原始JDBC操作数据库 传统JDBC方式实现数据库操作 package com.imooc.util; import java.io.InputStream; import java.sql.*; i ...
- Spring Data JPA简单使用
用Spring Data JPA操作数据库 这份教程教你用Spring Data JPA从关系数据库mysql中存储和提取数据.总结来自https://spring.io/guides/gs/acce ...
- Spring data jpa中Query和@Query分别返回map结果集
引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...
- Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!
前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...
- Spring Data JPA教程, 第三部分: Custom Queries with Query Methods(翻译)
在本人的Spring Data JPA教程的第二部分描述了如何用Spring Data JPA创建一个简单的CRUD应用,本博文将描述如何在Spring Data JPA中使用query方法创建自定义 ...
- spring data jpa 利用@Query进行查询
参照https://blog.csdn.net/yingxiake/article/details/51016234#reply https://blog.csdn.net/choushi300/ar ...
随机推荐
- [CF 351B]Jeff and Furik[归并排序求逆序数]
题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...
- PHP本地环境搭配——WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法
WAMP不能启动, 一直处于红色图标(正常启动为绿色吧) 考虑是端口的问题,我找到wamp文件夹中的wamp\bin\apache\apache2.2.22\conf路径下的httpd.conf文件, ...
- [RxJS] Transformation operators: delay and delayWhen
This lessons teaches about delay and delayWhen: simple operators that time shift. delay(number | dat ...
- 开源 免费 java CMS - FreeCMS2.1 会员站内信
项目地址:http://www.freeteam.cn/ 站内信 1.1.1 写信 从左側管理菜单点击写信进入. 输入收信人.标题.内容后点击发送button. 1.1.2 收件箱 从左側管理菜单点击 ...
- 实用技巧:简单而有用的nohup命令介绍(转)
简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站 ...
- ROS中Mangle解析
http://blog.csdn.net/bluecy/article/details/8192307
- web.xml常用标签整理(不定期更新)
<?xml version="1.0" encoding="UTF-8"?><!-- 标明使用的XML版本和文档编码,此项必须位于第一行,之前 ...
- JSBridge(Android和IOS平台)的设计和实现
前言 对于商务类的app,随着app注册使用人数递增,app的运营者们就会逐渐考虑在应用中开展一些推广活动.大多数活动具备时效性强.运营时间短的特征,一般产品们和运营者们都是通过wap页面快速投放到产 ...
- Xcode常见报错及解决办法
报错一: 在iOS7的真机运行时,弹出错误:App installation failed. There was an internal API error. 如图 解决办法: 在Xcode -> ...
- Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素
1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5 ...