jpa 聯表查詢 返回自定義對象 hql語法 原生sql 語法 1.11.9版本

-----業務場景中常常涉及到聯查,jpa的hql語法提供了內鏈接的查詢方式(不支持複雜hql,好比left join ,right join).  上代碼了java

 

 

1.咱們要聯查房屋和房屋用戶中間表,經過房屋id關聯 homeInfo是房屋表,homeUser是房屋用戶中間表.mysql

homeInfospring

  1 package management.entity.carandhome;
  2 
  3 import java.io.Serializable;
  4 import java.math.BigDecimal;
  5 import java.util.ArrayList;
  6 import java.util.Date;
  7 import java.util.HashSet;
  8 import java.util.List;
  9 import java.util.Set;
 10 
 11 import javax.persistence.Entity;
 12 import javax.persistence.FetchType;
 13 import javax.persistence.GeneratedValue;
 14 import javax.persistence.Id;
 15 import javax.persistence.JoinColumn;
 16 import javax.persistence.JoinTable;
 17 import javax.persistence.ManyToMany;
 18 import javax.persistence.OneToMany;
 19 import javax.persistence.OneToOne;
 20 import javax.persistence.Table;
 21 
 22 import org.hibernate.annotations.NotFound;
 23 import org.hibernate.annotations.NotFoundAction;
 24 
 25 import com.alibaba.fastjson.annotation.JSONField;
 26 import management.entity.paymentfee.LifeFee;
 27 import management.entity.paymentfee.ManageFee;
 28 
 29 @Entity
 30 @Table(name = "t_ss_w_home")
 31 // 房屋信息表
 32 public class HomeInfo implements Serializable {
 33 
 34     /**
 35      *
 36      */
 37     private static final long serialVersionUID = 1L;
 38 
 39     public HomeInfo() {
 40         super();
 41         // TODO Auto-generated constructor stub
 42     }
 43 
 44 
 45     @Id
 46     @GeneratedValue
 47     // 房屋ID
 48     private Long homeID;
 49 
 50     // 用戶id,這個是標識房主的用戶id,關聯表查詢出來的房主不靠譜
 51     private Long userID;
 52 
 53     // @NotNull
 54     // @Size(min = 3, max = 16)
 55     // 房屋面積
 56     private BigDecimal grossArea;
 57 
 58     // 實際面積
 59     private BigDecimal realArea;
 60 
 61     // 戶型
 62     private String houseType;
 63 
 64     // 朝向
 65     private String orientaion;
 66 
 67     // 入住時間
 68     @JSONField(format = "yyyy-MM-dd")
 69     private Date chechTime;
 70 
 71     // 樓號
 72     private String homeNo;
 73 
 74     // 單元號
 75     private String homeUnit;
 76 
 77     // 房間號
 78     private String homeRoom;
 79 
 80     // 手機號
 81     private String mobileNo;
 82 
 83     // 備註
 84     private String homeRemark;
 85 
 86     // 房屋狀態
 87     private String homeState;
 88 
 89     // 房產性質
 90     private String homeNature;
 91 
 92     // 樓層
 93     private String homeFloor;
 94 
 95     // 房屋位置
 96     private String homeLo;
 97 
 98     public Long getUserID() {
 99         return userID;
100     }
101 
102     public void setUserID(Long userID) {
103         this.userID = userID;
104     }
105 //
106 
107     @OneToMany(fetch = FetchType.EAGER, mappedBy = "homeInfo")
108     @NotFound(action = NotFoundAction.IGNORE)
109     private Set<HomeUser> homeUserList = new HashSet<>();
110 
111     @OneToMany(mappedBy = "homeInfo", fetch = FetchType.EAGER)
112     @NotFound(action = NotFoundAction.IGNORE)
113     private Set<ManageFee> manageFeeList = new HashSet<>();
114 
115     @OneToMany(mappedBy = "homeInfo", fetch = FetchType.EAGER)
116     @NotFound(action = NotFoundAction.IGNORE)
117     private Set<LifeFee> lifeFeeList = new HashSet<>();
118 
119     @NotFound(action = NotFoundAction.IGNORE)
120     @OneToOne(fetch = FetchType.EAGER)
121     @JoinColumn(name = "homeID", referencedColumnName = "homeID", insertable = false, updatable = false)
122     private HouseConfirm houseConfirm;
123 
124     public List<HomeUser> getHomeUserList() {
125         return new ArrayList<>(homeUserList);
126     }
127 
128     public void setHomeUserList(Set<HomeUser> homeUserList) {
129         this.homeUserList = homeUserList;
130     }
131 
132     public Long getHomeID() {
133         return homeID;
134     }
135 
136     public void setHomeID(Long homeID) {
137         this.homeID = homeID;
138     }
139 
140     public BigDecimal getGrossArea() {
141         return grossArea;
142     }
143 
144     public void setGrossArea(BigDecimal grossArea) {
145         this.grossArea = grossArea;
146     }
147 
148     public BigDecimal getRealArea() {
149         return realArea;
150     }
151 
152     public void setRealArea(BigDecimal realArea) {
153         this.realArea = realArea;
154     }
155 
156     public String getHouseType() {
157         return houseType;
158     }
159 
160     public void setHouseType(String houseType) {
161         this.houseType = houseType;
162     }
163 
164     public String getOrientaion() {
165         return orientaion;
166     }
167 
168     public void setOrientaion(String orientaion) {
169         this.orientaion = orientaion;
170     }
171 
172     public Date getChechTime() {
173         return chechTime;
174     }
175 
176     public void setChechTime(Date chechTime) {
177         this.chechTime = chechTime;
178     }
179 
180     public String getMobileNo() {
181         return mobileNo;
182     }
183 
184     public void setMobileNo(String mobileNo) {
185         this.mobileNo = mobileNo;
186     }
187 
188     public String getHomeRemark() {
189         return homeRemark;
190     }
191 
192     public void setHomeRemark(String homeRemark) {
193         this.homeRemark = homeRemark;
194     }
195 
196     public String getHomeState() {
197         return homeState;
198     }
199 
200     public void setHomeState(String homeState) {
201         this.homeState = homeState;
202     }
203 
204     public String getHomeNature() {
205         return homeNature;
206     }
207 
208     public void setHomeNature(String homeNature) {
209         this.homeNature = homeNature;
210     }
211 
212     public String toString() {
213         return "{homeState:" + this.homeState + "}";
214     }
215 
216     public String getHomeLo() {
217         return homeLo;
218     }
219 
220     public void setHomeLo(String homeLo) {
221         this.homeLo = homeLo;
222     }
223 
224     public List<ManageFee> getManageFeeList() {
225         return new ArrayList<>(manageFeeList);
226     }
227 
228     public void setManageFeeList(Set<ManageFee> manageFeeList) {
229         this.manageFeeList = manageFeeList;
230     }
231 
232     public List<LifeFee> getLifeFeeList() {
233         return new ArrayList<>(lifeFeeList);
234     }
235 
236     public void setLifeFeeList(Set<LifeFee> lifeFeeList) {
237         this.lifeFeeList = lifeFeeList;
238     }
239 
240     public String getHomeNo() {
241         return homeNo;
242     }
243 
244     public void setHomeNo(String homeNo) {
245         this.homeNo = homeNo;
246     }
247 
248     public String getHomeUnit() {
249         return homeUnit;
250     }
251 
252     public void setHomeUnit(String homeUnit) {
253         this.homeUnit = homeUnit;
254     }
255 
256     public String getHomeRoom() {
257         return homeRoom;
258     }
259 
260     public void setHomeRoom(String homeRoom) {
261         this.homeRoom = homeRoom;
262     }
263 
264     public String getHomeFloor() {
265         return homeFloor;
266     }
267 
268     public void setHomeFloor(String homeFloor) {
269         this.homeFloor = homeFloor;
270     }
271 
272     public HouseConfirm getHouseConfirm() {
273         return houseConfirm;
274     }
275 
276     public void setHouseConfirm(HouseConfirm houseConfirm) {
277         this.houseConfirm = houseConfirm;
278     }
279 
280 }

homeUsersql

 1 package management.entity.carandhome;
 2 
 3 import com.alibaba.fastjson.annotation.JSONField;
 4 import com.fasterxml.jackson.annotation.JsonIgnore;
 5 import org.hibernate.annotations.NotFound;
 6 import org.hibernate.annotations.NotFoundAction;
 7 
 8 import javax.persistence.*;
 9 import java.io.Serializable;
10 
11 @Entity
12 @Table(name = "t_ss_w_home_user")
13 public class HomeUser implements Serializable {
14 
15     /**
16      *
17      */
18     private static final long serialVersionUID = 1L;
19 
20 
21     @Id
22     @GeneratedValue
23     private Long homeUserID;
24 
25     private Long userID;
26 
27     private Long homeID;
28 
29     @JSONField
30     @JsonIgnore
31     @ManyToOne
32     @JoinColumn(name = "homeID", insertable = false, updatable = false)
33     @NotFound(action = NotFoundAction.IGNORE)
34     private HomeInfo homeInfo;
35 
36     public HomeUser() {
37         super();
38     }
39 
40     public HomeInfo getHomeInfo() {
41         return homeInfo;
42     }
43 
44     public void setHomeInfo(HomeInfo homeInfo) {
45         this.homeInfo = homeInfo;
46     }
47 
48     public Long getHomeUserID() {
49         return homeUserID;
50     }
51 
52     public void setHomeUserID(Long homeUserID) {
53         this.homeUserID = homeUserID;
54     }
55 
56     public Long getUserID() {
57         return userID;
58     }
59 
60     public void setUserID(Long userID) {
61         this.userID = userID;
62     }
63 
64     public Long getHomeID() {
65         return homeID;
66     }
67 
68     public void setHomeID(Long homeID) {
69         this.homeID = homeID;
70     }
71 
72     @Override
73     public String toString() {
74         return "HomeUser [homeUserID=" + homeUserID + ", userID=" + userID + ", homeID=" + homeID + "]";
75     }
76 
77 }

 

自定義的聯查結果實體類 json

  1 package management.entity.carandhome;
  2 
  3 import java.io.Serializable;
  4 import java.math.BigDecimal;
  5 import java.util.ArrayList;
  6 import java.util.Date;
  7 import java.util.HashSet;
  8 import java.util.List;
  9 import java.util.Set;
 10 
 11 import javax.persistence.Entity;
 12 import javax.persistence.FetchType;
 13 import javax.persistence.GeneratedValue;
 14 import javax.persistence.Id;
 15 import javax.persistence.JoinColumn;
 16 import javax.persistence.JoinTable;
 17 import javax.persistence.ManyToMany;
 18 import javax.persistence.OneToMany;
 19 import javax.persistence.OneToOne;
 20 import javax.persistence.Table;
 21 
 22 import org.hibernate.annotations.NotFound;
 23 import org.hibernate.annotations.NotFoundAction;
 24 
 25 import com.alibaba.fastjson.annotation.JSONField;
 26 import management.entity.paymentfee.LifeFee;
 27 import management.entity.paymentfee.ManageFee;

31 public class HomeUserAppVO implements Serializable { 32 33 /** 34 * 35 */ 36 private static final long serialVersionUID = 1L; 37 38 public HomeUserAppVO() { 39 super(); 40 }
// 這個構造方法必須有, 且要與後面的聯查hql語句對應
41 public HomeUserAppVO(Long homeID, String homeNo, String homeUnit, String homeRoom, String mobileNo, 42 String homeState, String homeNature, String homeFloor, String homeLo) { 43 super(); 44 this.homeID = homeID; 45 this.homeNo = homeNo; 46 this.homeUnit = homeUnit; 47 this.homeRoom = homeRoom; 48 this.mobileNo = mobileNo; 49 this.homeState = homeState; 50 this.homeNature = homeNature; 51 this.homeFloor = homeFloor; 52 this.homeLo = homeLo; 53 } 54 private Long homeID; 55 56 // 樓號 57 private String homeNo; 58 59 // 單元號 60 private String homeUnit; 61 62 // 房間號 63 private String homeRoom; 64 65 // 手機號 66 private String mobileNo; 67 68 69 // 房屋狀態 70 private String homeState; 71 72 // 房產性質 73 private String homeNature; 74 75 // 樓層 76 private String homeFloor; 77 78 // 房屋位置 79 private String homeLo; 80 // 用戶角色(房主,家人,租客) 81 private String familyRelationship; 82 public Long getHomeID() { 83 return homeID; 84 } 85 public void setHomeID(Long homeID) { 86 this.homeID = homeID; 87 } 88 public String getHomeNo() { 89 return homeNo; 90 } 91 public void setHomeNo(String homeNo) { 92 this.homeNo = homeNo; 93 } 94 public String getHomeUnit() { 95 return homeUnit; 96 } 97 public void setHomeUnit(String homeUnit) { 98 this.homeUnit = homeUnit; 99 } 100 public String getHomeRoom() { 101 return homeRoom; 102 } 103 public void setHomeRoom(String homeRoom) { 104 this.homeRoom = homeRoom; 105 } 106 public String getMobileNo() { 107 return mobileNo; 108 } 109 public void setMobileNo(String mobileNo) { 110 this.mobileNo = mobileNo; 111 } 112 public String getHomeState() { 113 return homeState; 114 } 115 public void setHomeState(String homeState) { 116 this.homeState = homeState; 117 } 118 public String getHomeNature() { 119 return homeNature; 120 } 121 public void setHomeNature(String homeNature) { 122 this.homeNature = homeNature; 123 } 124 public String getHomeFloor() { 125 return homeFloor; 126 } 127 public void setHomeFloor(String homeFloor) { 128 this.homeFloor = homeFloor; 129 } 130 public String getHomeLo() { 131 return homeLo; 132 } 133 public void setHomeLo(String homeLo) { 134 this.homeLo = homeLo; 135 } 136 public String getFamilyRelationship() { 137 return familyRelationship; 138 } 139 public void setFamilyRelationship(String familyRelationship) { 140 familyRelationship = familyRelationship; 141 } 142 @Override 143 public String toString() { 144 return "HomeUserAppVO [homeID=" + homeID + ", homeNo=" + homeNo + ", homeUnit=" + homeUnit + ", homeRoom=" 145 + homeRoom + ", mobileNo=" + mobileNo + ", homeState=" + homeState + ", homeNature=" + homeNature 146 + ", homeFloor=" + homeFloor + ", homeLo=" + homeLo + ", FamilyRelationship=" + familyRelationship 147 + "]"; 148 } 149 150 }

 

 

2.實體類建好,這裏咱們直接寫持久層代碼app

 

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(有此問題的須要加,沒有的就不用,個人版本不用,這裏順帶提一下dom

        url: jdbc:mysql://mysql:3306/property_manager?useUnicode=true&characterEncoding=utf-8&useOldAliasMetadataBehavior=trueide

相關文章
相關標籤/搜索