jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本
-----业务场景中经常涉及到联查,jpa的hql语法提供了内连接的查询方式(不支持复杂hql,比如left join ,right join). 上代码了
1.我们要联查房屋和房屋用户中间表,通过房屋id关联 homeInfo是房屋表,homeUser是房屋用户中间表.
homeInfo
package management.entity.carandhome; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table; import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction; import com.alibaba.fastjson.annotation.JSONField;
import management.entity.paymentfee.LifeFee;
import management.entity.paymentfee.ManageFee; @Entity
@Table(name = "t_ss_w_home")
// 房屋信息表
public class HomeInfo implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L; public HomeInfo() {
super();
// TODO Auto-generated constructor stub
} @Id
@GeneratedValue
// 房屋ID
private Long homeID; // 用户id,这个是标识房主的用户id,关联表查询出来的房主不靠谱
private Long userID; // @NotNull
// @Size(min = 3, max = 16)
// 房屋面积
private BigDecimal grossArea; // 实际面积
private BigDecimal realArea; // 户型
private String houseType; // 朝向
private String orientaion; // 入住时间
@JSONField(format = "yyyy-MM-dd")
private Date chechTime; // 楼号
private String homeNo; // 单元号
private String homeUnit; // 房间号
private String homeRoom; // 手机号
private String mobileNo; // 备注
private String homeRemark; // 房屋状态
private String homeState; // 房产性质
private String homeNature; // 楼层
private String homeFloor; // 房屋位置
private String homeLo; public Long getUserID() {
return userID;
} public void setUserID(Long userID) {
this.userID = userID;
}
// @OneToMany(fetch = FetchType.EAGER, mappedBy = "homeInfo")
@NotFound(action = NotFoundAction.IGNORE)
private Set<HomeUser> homeUserList = new HashSet<>(); @OneToMany(mappedBy = "homeInfo", fetch = FetchType.EAGER)
@NotFound(action = NotFoundAction.IGNORE)
private Set<ManageFee> manageFeeList = new HashSet<>(); @OneToMany(mappedBy = "homeInfo", fetch = FetchType.EAGER)
@NotFound(action = NotFoundAction.IGNORE)
private Set<LifeFee> lifeFeeList = new HashSet<>(); @NotFound(action = NotFoundAction.IGNORE)
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "homeID", referencedColumnName = "homeID", insertable = false, updatable = false)
private HouseConfirm houseConfirm; public List<HomeUser> getHomeUserList() {
return new ArrayList<>(homeUserList);
} public void setHomeUserList(Set<HomeUser> homeUserList) {
this.homeUserList = homeUserList;
} public Long getHomeID() {
return homeID;
} public void setHomeID(Long homeID) {
this.homeID = homeID;
} public BigDecimal getGrossArea() {
return grossArea;
} public void setGrossArea(BigDecimal grossArea) {
this.grossArea = grossArea;
} public BigDecimal getRealArea() {
return realArea;
} public void setRealArea(BigDecimal realArea) {
this.realArea = realArea;
} public String getHouseType() {
return houseType;
} public void setHouseType(String houseType) {
this.houseType = houseType;
} public String getOrientaion() {
return orientaion;
} public void setOrientaion(String orientaion) {
this.orientaion = orientaion;
} public Date getChechTime() {
return chechTime;
} public void setChechTime(Date chechTime) {
this.chechTime = chechTime;
} public String getMobileNo() {
return mobileNo;
} public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
} public String getHomeRemark() {
return homeRemark;
} public void setHomeRemark(String homeRemark) {
this.homeRemark = homeRemark;
} public String getHomeState() {
return homeState;
} public void setHomeState(String homeState) {
this.homeState = homeState;
} public String getHomeNature() {
return homeNature;
} public void setHomeNature(String homeNature) {
this.homeNature = homeNature;
} public String toString() {
return "{homeState:" + this.homeState + "}";
} public String getHomeLo() {
return homeLo;
} public void setHomeLo(String homeLo) {
this.homeLo = homeLo;
} public List<ManageFee> getManageFeeList() {
return new ArrayList<>(manageFeeList);
} public void setManageFeeList(Set<ManageFee> manageFeeList) {
this.manageFeeList = manageFeeList;
} public List<LifeFee> getLifeFeeList() {
return new ArrayList<>(lifeFeeList);
} public void setLifeFeeList(Set<LifeFee> lifeFeeList) {
this.lifeFeeList = lifeFeeList;
} public String getHomeNo() {
return homeNo;
} public void setHomeNo(String homeNo) {
this.homeNo = homeNo;
} public String getHomeUnit() {
return homeUnit;
} public void setHomeUnit(String homeUnit) {
this.homeUnit = homeUnit;
} public String getHomeRoom() {
return homeRoom;
} public void setHomeRoom(String homeRoom) {
this.homeRoom = homeRoom;
} public String getHomeFloor() {
return homeFloor;
} public void setHomeFloor(String homeFloor) {
this.homeFloor = homeFloor;
} public HouseConfirm getHouseConfirm() {
return houseConfirm;
} public void setHouseConfirm(HouseConfirm houseConfirm) {
this.houseConfirm = houseConfirm;
} }
homeUser
package management.entity.carandhome; import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction; import javax.persistence.*;
import java.io.Serializable; @Entity
@Table(name = "t_ss_w_home_user")
public class HomeUser implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L; @Id
@GeneratedValue
private Long homeUserID; private Long userID; private Long homeID; @JSONField
@JsonIgnore
@ManyToOne
@JoinColumn(name = "homeID", insertable = false, updatable = false)
@NotFound(action = NotFoundAction.IGNORE)
private HomeInfo homeInfo; public HomeUser() {
super();
} public HomeInfo getHomeInfo() {
return homeInfo;
} public void setHomeInfo(HomeInfo homeInfo) {
this.homeInfo = homeInfo;
} public Long getHomeUserID() {
return homeUserID;
} public void setHomeUserID(Long homeUserID) {
this.homeUserID = homeUserID;
} public Long getUserID() {
return userID;
} public void setUserID(Long userID) {
this.userID = userID;
} public Long getHomeID() {
return homeID;
} public void setHomeID(Long homeID) {
this.homeID = homeID;
} @Override
public String toString() {
return "HomeUser [homeUserID=" + homeUserID + ", userID=" + userID + ", homeID=" + homeID + "]";
} }
自定义的联查结果实体类
package management.entity.carandhome; import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table; import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction; import com.alibaba.fastjson.annotation.JSONField;
import management.entity.paymentfee.LifeFee;
import management.entity.paymentfee.ManageFee; public class HomeUserAppVO implements Serializable { /**
*
*/
private static final long serialVersionUID = 1L; public HomeUserAppVO() {
super();
}
// 这个构造方法必须有, 且要与后面的联查hql语句对应
public HomeUserAppVO(Long homeID, String homeNo, String homeUnit, String homeRoom, String mobileNo,
String homeState, String homeNature, String homeFloor, String homeLo) {
super();
this.homeID = homeID;
this.homeNo = homeNo;
this.homeUnit = homeUnit;
this.homeRoom = homeRoom;
this.mobileNo = mobileNo;
this.homeState = homeState;
this.homeNature = homeNature;
this.homeFloor = homeFloor;
this.homeLo = homeLo;
}
private Long homeID; // 楼号
private String homeNo; // 单元号
private String homeUnit; // 房间号
private String homeRoom; // 手机号
private String mobileNo; // 房屋状态
private String homeState; // 房产性质
private String homeNature; // 楼层
private String homeFloor; // 房屋位置
private String homeLo;
// 用户角色(房主,家人,租客)
private String familyRelationship;
public Long getHomeID() {
return homeID;
}
public void setHomeID(Long homeID) {
this.homeID = homeID;
}
public String getHomeNo() {
return homeNo;
}
public void setHomeNo(String homeNo) {
this.homeNo = homeNo;
}
public String getHomeUnit() {
return homeUnit;
}
public void setHomeUnit(String homeUnit) {
this.homeUnit = homeUnit;
}
public String getHomeRoom() {
return homeRoom;
}
public void setHomeRoom(String homeRoom) {
this.homeRoom = homeRoom;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
public String getHomeState() {
return homeState;
}
public void setHomeState(String homeState) {
this.homeState = homeState;
}
public String getHomeNature() {
return homeNature;
}
public void setHomeNature(String homeNature) {
this.homeNature = homeNature;
}
public String getHomeFloor() {
return homeFloor;
}
public void setHomeFloor(String homeFloor) {
this.homeFloor = homeFloor;
}
public String getHomeLo() {
return homeLo;
}
public void setHomeLo(String homeLo) {
this.homeLo = homeLo;
}
public String getFamilyRelationship() {
return familyRelationship;
}
public void setFamilyRelationship(String familyRelationship) {
familyRelationship = familyRelationship;
}
@Override
public String toString() {
return "HomeUserAppVO [homeID=" + homeID + ", homeNo=" + homeNo + ", homeUnit=" + homeUnit + ", homeRoom="
+ homeRoom + ", mobileNo=" + mobileNo + ", homeState=" + homeState + ", homeNature=" + homeNature
+ ", homeFloor=" + homeFloor + ", homeLo=" + homeLo + ", FamilyRelationship=" + familyRelationship
+ "]";
} }
2.实体类建好,这里我们直接写持久层代码
package management.dao.carandhome; import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import management.dao.BaseDao;
import management.entity.carandhome.HomeInfo;
import management.entity.carandhome.HomeUserAppVO;
import management.vo.carHome.HomeInfoVO; @Repository
public interface HomeInfoDao extends BaseDao<HomeInfo> { //联查,返回自定义对象,使用hql语句. 这里需要注意三点【1.new 全类路径名(属性1,属性2) 2.属性名称要与实体类一一对应,大小写都不能差,否则会报异常 3.自定义类的构造方法里的字段要与这里一一对应】
@Query(
value = "select new management.entity.carandhome.HomeUserAppVO(h.homeID,h.homeNo,h.homeUnit,h.homeRoom,"
+ "h.mobileNo,h.homeState,h.homeNature,h.homeFloor,h.homeLo) from HomeInfo h , HomeUser hu where h.homeID=hu.homeID"
+ " and hu.userID=:id")
List<HomeUserAppVO> findHomeInfoByUserId(@Param("id") Long id); // 原生sql联查语句写法,但是返回对象是一个object【】,因为使用了原生语句,只能自己再去一一对应,然后封装到自己的业务bean中。
@Query(
value = "SELECT " + " h.*, t.countUser " + "FROM " + " ( " + " SELECT "
+ " hu.HomeID homeID, " + " count(hu.UserID) countUser " + " FROM " + " ( "
+ " SELECT " + " hu.HomeID homeID " + " FROM " + " t_ss_w_home_user hu "
+ " WHERE " + " hu.UserID = :userID " + " ) t "
+ " LEFT JOIN t_ss_w_home_user hu ON hu.HomeID = t.homeID " + " GROUP BY "
+ " hu.HomeID " + " ) t " + "LEFT JOIN t_ss_w_home h ON t.homeID = h.HomeID",
nativeQuery = true)
List<Object[]> findByUserIdAndCountUser(@Param("userID") Long userID); }
4.再写原生的sql时,别名 如果不能使用,需要在连接mysql配置时 增加 useOldAliasMetadataBehavior=true(有此问题的需要加,没有的就不用,我的版本不用,这里顺带提一下)
url: jdbc:mysql://mysql:3306/property_manager?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=true
jpa 联表查询 返回自定义对象 hql语法 原生sql 语法 1.11.9版本的更多相关文章
- 关于Spring Data JPA 多表查询 返回自定义Vo的问题记录
这两天开了一个新项目,使用SpringBoot+SpringData, 刚做了一个小功能,都是一张表的操作没什么问题,今天设计到了两张表联查,两张表各取了几个字段,组合成了一个vo, 当我用原生sq ...
- Spring Hibernate JPA 联表查询 复杂查询(转)
今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...
- Spring Hibernate JPA 联表查询 复杂查询
今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...
- Spring Data Jpa 查询返回自定义对象
转载请注明出处:http://www.wangyongkui.com/java-jpa-query. 今天使用Jpa遇到一个问题,发现查询多个字段时返回对象不能自动转换成自定义对象.代码如下: //U ...
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...
- mybatis 联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- FreeSql (十七)联表查询
FreeSql在查询数据下足了功能,链式查询语法.多表查询.表达式函数支持得非常到位. IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnect ...
- MyBatis-Plus联表查询的短板,终于有一款工具补齐了
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的 ...
- sql学习笔记(三)—— 联表查询
上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...
随机推荐
- Java的接口、继承与多态
接口 java只支持单继承,即一个类只能有一个父类,因此需要接口来实现多重继承. 接口的定义 类和接口的区别:一个类通过继承接口的方式,从而来继承接口的抽象方法.类描述对象的属性和方法,接口则包含类要 ...
- centos7配置apache服务
首先写下基本的步骤: 1.环境准备:关闭防火墙(不关闭无法访问,我这里只是简单的配置,实际部署项目应该会有具体的设置),关闭selinux(试过,不关闭也没事,一般都关闭) 配置 ip 2.安装软件包 ...
- 10-部署配置dashboard插件
配置和安装 dashboard 官方文件目录:kubernetes/cluster/addons/dashboard 我们需要使用的yaml文件 $ ls *.yaml dashboard-contr ...
- 【Redis面试题】Redis的字符串是怎么实现的?
年前本人在找工作面试时在Redis相关问题上可栽了跟头.在面试前按常规套路准备了一下,比如 Redis 的常用5种数据结构,Redis持久化策略,Redis实现分布式锁,简单发布订阅等等都准备了,当时 ...
- [EXP]Adobe ColdFusion 2018 - Arbitrary File Upload
# Exploit Title: Unrestricted # Google Dork: ext:cfm # Date: -- # Exploit Author: Pete Freitag of Fo ...
- Xamarin.Android SharedPreferences的使用方法
SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data/data/<包名>/shared_pref ...
- 【Promise】Promise实现请求超时处理(基本版)
首先是没有加入请求超时的情况: var http = require('http'); var url = require('url'); function get(addr) { return ne ...
- await和async在一般处理程序中的使用
写在前面 有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容.就想着自己折腾 ...
- thinkphp设置默认访问的模块
在index.php中加入(可以省略Home,直接写控制器和方法访问) define('BIND_MODULE','Home'); 在config.php里边加入 'MODULE_ALLOW_LIST ...
- Springboot项目打包成jar运行2种方式
最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式, ...