最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring?jpa設(shè)置多個主鍵遇到的小坑及解決

 更新時間:2022年06月13日 10:10:23   作者:TEN上海哥  
這篇文章主要介紹了spring?jpa設(shè)置多個主鍵遇到的小坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

jpa設(shè)置多個主鍵遇到的坑

由于項目需要,對多個業(yè)務(wù)表單獨另外建立對應(yīng)的歷史版本記錄表,為了原業(yè)務(wù)表數(shù)據(jù)能原封不動記錄到歷史版本表,需要建立組合主鍵,id+歷史版本號作為主鍵唯一約束(rid+historyVersion)。

在實體上需要設(shè)置為主鍵的字段加上注解,@Id,例如:

/*
* 主鍵-RID
*/
@Id
@Column(name = "RID", length = 36)
private String rid;

這樣會導(dǎo)致,若是該實體存在父類,那就會啟動報錯,初始化不了

錯誤信息: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遇到多主鍵表如何進行查詢

數(shù)據(jù)表是原始就存在的,里面存在兩個主鍵:

當(dāng)建好實體類,然后用jpa去關(guān)聯(lián)操作查詢,(根據(jù)StudyId)去進行查詢的時候,發(fā)現(xiàn)原本可以有八條不一樣的記錄,只是StudyId相同,其他的不同,這個時候,出來確實是八條,但是居然每一條都一樣,是根據(jù)StudyId一樣的數(shù)據(jù)記錄里的都一條。

即當(dāng)根據(jù)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);

然后循環(huán)打印icFilmInfoList

FileName查出來都是1

后來才發(fā)現(xiàn)是聯(lián)合主鍵惹得鍋,數(shù)據(jù)庫表中有兩個主鍵,一個是StudyId,還有一個是FileName。

我的實體類是這么定義的(因為我只需要StudyId和FileName的信息就行了):

當(dāng)JPA在根據(jù)StudyId去查詢的時候,只會將StudyId當(dāng)做主鍵,當(dāng)StudyId一樣的時候,JPA會當(dāng)做所有的都是同一條記錄,不會管FileName是否相同了,一股腦的返回八條一樣的數(shù)據(jù)。

對此其實有很多種解決辦法,說下我使用的幾種:

1、使用 List<Map<String, Object>>的方式去接收

由于這邊數(shù)據(jù)庫的記錄值都字符串類型,我就直接使用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);

循環(huán)答應(yīng)查詢結(jié)果:

這種方式有點就是代碼簡單,但是如果要對查詢的結(jié)果再進行一步處理的話,就會變的更復(fù)雜,不好處理。

2、自定義接收類

新建一個IcFilmInfoVO類:

@AllArgsConstructor
@Data
public class IcFilmInfoVO {
    private String studyId;
    /**
     * 文件名
     */
    private String fileName;
}

注意添加的全參構(gòu)造方法注解@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的

然后循環(huán)打印查詢結(jié)果:

這樣即使以后要操作查詢的結(jié)果也很方便,同時這種自定義接收類的用法還可以用于統(tǒng)計等業(yè)務(wù)場景,可以接收sum,count等SQL內(nèi)置函數(shù)查詢出來的結(jié)果。

3、配置聯(lián)合主鍵

由于表中是兩個主鍵的存在,接下來改造一下我們的實體類:

@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;
}

在兩個主鍵映射的字段上都標(biāo)注@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);

總結(jié):針對上面三種方法,貌似都可以解決我們的問題,但是個人只推薦第三種,應(yīng)為第三種是最貼合數(shù)據(jù)庫的,使用了聯(lián)合主鍵的注解,數(shù)據(jù)庫中也是多主鍵,但是第二種方式可以很好的解決我們在使用JPA去查詢的時候接口其他非數(shù)據(jù)庫字段的信息,例如統(tǒng)計等方面。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 你知道Tomcat安裝之前為什么要安裝JDK

    你知道Tomcat安裝之前為什么要安裝JDK

    這篇文章主要介紹了你知道Tomcat安裝之前為什么要安裝JDK嗎?具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • SpringBoot項目使用MDC給日志增加唯一標(biāo)識的實現(xiàn)步驟

    SpringBoot項目使用MDC給日志增加唯一標(biāo)識的實現(xiàn)步驟

    本文介紹了如何在SpringBoot項目中使用MDC(Mapped?Diagnostic?Context)為日志增加唯一標(biāo)識,以便于日志追蹤,通過創(chuàng)建日志攔截器、配置攔截器以及修改日志配置文件,可以實現(xiàn)這一功能,文章還提供了源碼地址,方便讀者學(xué)習(xí)和參考,感興趣的朋友一起看看吧
    2025-03-03
  • java基礎(chǔ)之泛型知識點總結(jié)

    java基礎(chǔ)之泛型知識點總結(jié)

    這篇文章主要介紹了java基礎(chǔ)之泛型知識點總結(jié),文中有非常詳細的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • java微信公眾號開發(fā)第一步 公眾號接入和access_token管理

    java微信公眾號開發(fā)第一步 公眾號接入和access_token管理

    這篇文章主要為大家介紹了java微信公眾號開發(fā),主要內(nèi)容包括公眾號接入和access_token管理,感興趣的小伙伴們可以參考一下
    2016-01-01
  • 詳解java.lang.reflect.Modifier.isInterface()方法

    詳解java.lang.reflect.Modifier.isInterface()方法

    這篇文章主要介紹了詳解java.lang.reflect.Modifier.isInterface()方法的相關(guān)資料,這里提供實例幫助大家理解這個方法的使用,需要的朋友可以參考下
    2017-09-09
  • java對象拷貝詳解及實例

    java對象拷貝詳解及實例

    這篇文章主要介紹了java對象拷貝詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 一文弄懂fastjson

    一文弄懂fastjson

    fastjson?是一個java語言編寫的高性能且功能完善的JSON庫,本文主要介紹了fastjson的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-05-05
  • Java主流壓縮解壓工具對比、用法與選取詳解

    Java主流壓縮解壓工具對比、用法與選取詳解

    開發(fā)過程中可能會用到壓縮文件的需求,下面這篇文章主要給大家介紹了關(guān)于Java主流壓縮解壓工具對比、用法與選取的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • springboot自定義starter啟動器的具體使用實踐

    springboot自定義starter啟動器的具體使用實踐

    本文主要介紹了springboot自定義starter啟動器的具體使用實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • idea引入外部jar包的方法實現(xiàn)

    idea引入外部jar包的方法實現(xiàn)

    本文主要介紹了idea引入外部jar包的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評論

怀远县| 奉节县| 衡水市| 宁夏| 屏南县| 祁连县| 津南区| 林周县| 大足县| 南开区| 常德市| 嘉鱼县| 依兰县| 永清县| 鹿邑县| 南丰县| 广德县| 聂荣县| 徐水县| 大悟县| 中阳县| 遂宁市| 德江县| 嘉定区| 临泉县| 广东省| 宁河县| 遂平县| 达孜县| 正安县| 雅江县| 新巴尔虎左旗| 洛浦县| 科尔| 闽侯县| 怀宁县| 乾安县| 黑河市| 海伦市| 隆化县| 腾冲县|