<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
由於專案需要,對多個業務表單獨另外建立對應的歷史版本記錄表,為了原業務表資料能原封不動記錄到歷史版本表,需要建立組合主鍵,id+歷史版本號作為主鍵唯一約束(rid+historyVersion)。
在實體上需要設定為主鍵的欄位加上註解,@Id,例如:
/* * 主鍵-RID */ @Id @Column(name = "RID", length = 36) private String rid;
這樣會導致,若是該實體存在父類別,那就會啟動報錯,初始化不了
錯誤資訊:does not define an IdClass。
必須要在類聲名注入@IdClass(HistoryPK.class)。
實體程式碼例子如下:
package com.southgis.officeHouse.entity; import java.io.Serializable; import javax.persistence.Id; import lombok.Data; import lombok.NoArgsConstructor; /** * * @author Administrator * 組合主鍵 */ @Data public class HistoryPK implements Serializable { private static final long serialVersionUID = 1L; /* * 主鍵-RID */ private String rid; /* * 主鍵-歷史版本號,儲存格式年份_版本號,例如2018_1 */ private String historyVersion; }
package com.southgis.officeHouse.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.IdClass; import javax.persistence.Index; import javax.persistence.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; /** * * @author Administrator * 單位基本資訊歷史版本表 */ @Data @EqualsAndHashCode(callSuper=false) @NoArgsConstructor @Entity @IdClass(HistoryPK.class) @Table(name = "UNIT_HISTORY",indexes={ @Index(name="inx_unitHistory_orgid",columnList="ORGID")}) public class UnitHistory extends UnitBase implements Serializable { private static final long serialVersionUID = -4466904221026481006L; /* * 主鍵-RID */ @Id @Column(name = "RID", length = 36) private String rid; /* * 主鍵-歷史版本號,儲存格式年份_版本號,例如2018_1 */ @Id @Column(name = "HISTORY_VERSION",length=36) private String historyVersion; }
資料表是原始就存在的,裡面存在兩個主鍵:
當建好實體類,然後用jpa去關聯操作查詢,(根據StudyId)去進行查詢的時候,發現原本可以有八條不一樣的記錄,只是StudyId相同,其他的不同,這個時候,出來確實是八條,但是居然每一條都一樣,是根據StudyId一樣的資料記錄裡的都一條。
即當根據StudyId='194205'去查的時候,JPA都會返回八條一樣的記錄
JPA程式碼:
@Query(value = "select * from tbl_ic_film_info where StudyId = ?1",nativeQuery = true) List<IcFilmInfo> findByStudyIdSQL(String studyId);
service程式碼:
List<IcFilmInfo> icFilmInfoList= icFilmInfoRepository.findByStudyIdSQL(studyId);
然後迴圈列印icFilmInfoList
FileName查出來都是1
後來才發現是聯合主鍵惹得鍋,資料庫表中有兩個主鍵,一個是StudyId,還有一個是FileName。
我的實體類是這麼定義的(因為我只需要StudyId和FileName的資訊就行了):
當JPA在根據StudyId去查詢的時候,只會將StudyId當做主鍵,當StudyId一樣的時候,JPA會當做所有的都是同一條記錄,不會管FileName是否相同了,一股腦的返回八條一樣的資料。
對此其實有很多種解決辦法,說下我使用的幾種:
由於這邊資料庫的記錄值都字串型別,我就直接使用List<Map<String, String>>了~
JPA程式碼:
@Query(value = "select StudyId,FileName from tbl_ic_film_info where StudyId = ?1",nativeQuery = true) List<Map<String,String>> findByStudyIdMap(String studyId);
迴圈答應查詢結果:
這種方式有點就是程式碼簡單,但是如果要對查詢的結果再進行一步處理的話,就會變的更復雜,不好處理。
新建一個IcFilmInfoVO類:
@AllArgsConstructor @Data public class IcFilmInfoVO { private String studyId; /** * 檔名 */ private String fileName; }
注意新增的全參構造方法註解@AllArgsConstructor
JAP程式碼
@Query(value = "select new cloud.image.vo.IcFilmInfoVO(t.studyId,t.fileName) from IcFilmInfo t where t.studyId = ?1") List<IcFilmInfoVO> findByStudyId(String studyId);
注意,這個時候這裡的@Query註解裡面是沒有加nativeQuery = true的
然後迴圈列印查詢結果:
這樣即使以後要操作查詢的結果也很方便,同時這種自定義接收類的用法還可以用於統計等業務場景,可以接收sum,count等SQL內建函數查詢出來的結果。
由於表中是兩個主鍵的存在,接下來改造一下我們的實體類:
@Entity @Data @IdClass(IcFilmInfoPk.class) @Table(name = "tbl_ic_film_info") public class IcFilmInfo implements Serializable { private static final long serialVersionUID = 9121531612760132363L; @Id @Column(name = "StudyId") private String studyId; /** * 檔名 */ @Id @Column(name = "FileName") private String fileName; }
在兩個主鍵對映的欄位上都標註@Id註解
同時新建一個IcFilmInfoPk類:
@Data public class IcFilmInfoPk implements Serializable { private static final long serialVersionUID = -1570834456846579284L; private String studyId; private String fileName; }
在實體類上加上@IdClass(IcFilmInfoPk.class)註解,這個時候就可以用一下JPA程式碼直接去查詢了
@Query(value = "select * from tbl_ic_film_info where StudyId = ?1",nativeQuery = true) List<IcFilmInfo> findByStudyIdSQL(String studyId);
總結:針對上面三種方法,貌似都可以解決我們的問題,但是個人只推薦第三種,應為第三種是最貼合資料庫的,使用了聯合主鍵的註解,資料庫中也是多主鍵,但是第二種方式可以很好的解決我們在使用JPA去查詢的時候介面其他非資料庫欄位的資訊,例如統計等方面。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45