JPA遇到多主鍵表怎麼進行查詢

2021-10-10 01:52:28 字數 2962 閱讀 8191

資料表是原始就存在的,裡面存在兩個主鍵:

當建好實體類,然後用jpa去關聯操作查詢,(根據studyid)去進行查詢的時候,發現原本可以有八條不一樣的記錄,只是studyid相同,其他的不同,這個時候,出來確實是八條,但是居然每一條都一樣,是根據studyid一樣的資料記錄裡的都一條。

即當根據studyid='194205'去查的時候,jpa都會返回八條一樣的記錄

jpa**:

@query

(value =

"select * from tbl_ic_film_info where studyid = ?1"

,nativequery =

true

)list

findbystudyidsql

(string studyid)

;

service**:

list

icfilminfolist= icfilminforepository.

findbystudyidsql

(studyid)

;

然後迴圈列印icfilminfolist

filename查出來都是1

後來才發現是聯合主鍵惹得鍋,資料庫表中有兩個主鍵,乙個是studyid,還有乙個是filename。

我的實體類是這麼定義的(因為我只需要studyid和filename的資訊就行了):

當jpa在根據studyid去查詢的時候,只會將studyid當做主鍵,當studyid一樣的時候,jpa會當做所有的都是同一條記錄,不會管filename是否相同了,一股腦的返回八條一樣的資料。

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

1、使用 list>的方式去接收

由於這邊資料庫的記錄值都字串型別,我就直接使用list>了~

jpa**:

@query

(value =

"select studyid,filename from tbl_ic_film_info where studyid = ?1"

,nativequery =

true

)list

>

findbystudyidmap

(string studyid)

;

迴圈答應查詢結果:

這種方式有點就是**簡單,但是如果要對查詢的結果再進行一步處理的話,就會變的更複雜,不好處理。

2、自定義接收類

新建乙個icfilminfovo類:

@allargsconstructor

@data

public

class

icfilminfovo

jap**

@query

(value =

"select new cloud.image.vo.icfilminfovo(t.studyid,t.filename) from icfilminfo t where t.studyid = ?1"

)list

findbystudyid

(string studyid)

;

3、配置聯合主鍵

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

@entity

@data

@idclass

(icfilminfopk.

class

)@table

(name =

"tbl_ic_film_info"

)public

class

icfilminfo

implements

serializable

在兩個主鍵對映的字段上都標註@id註解

同時新建乙個icfilminfopk類:

@data

public

class

icfilminfopk

implements

serializable

在實體類上加上@idclass(icfilminfopk.class)註解,這個時候就可以用一下jpa**直接去查詢了

@query

(value =

"select * from tbl_ic_film_info where studyid = ?1"

,nativequery =

true

)list

findbystudyidsql

(string studyid)

;

針對上面三種方法,貌似都可以解決我們的問題,但是個人只推薦第三種,應為第三種是最貼合資料庫的,使用了聯合主鍵的註解,資料庫中也是多主鍵,但是第二種方式可以很好的解決我們在使用jpa去查詢的時候介面其他非資料庫欄位的資訊,例如統計等方面。

JPA如何實現兩個表的非主鍵列的關聯

問題描述表關係 sync 多 media 一 在用jpa做向專案的時候,一般兩張表關聯的時候都是拿id關聯的,所以在實體類中維護註解 manytoone的時候,在sync表一般是這樣寫的 manytoone joincolumn name sn private media media 這個註解就是吧...

Oracle怎麼在建表時讓主鍵自動遞增

oracle怎麼在建表時讓主鍵自動遞增呢?首先我們建立乙個測試用的表 這裡就不講建表相關的知識了 create table by admin admin id int primary key admin username varchar 100 not null,admin password var...

EF插入遇到的問題 表沒有主鍵時

解決方法一 看表是否有主鍵,一般就是表缺主鍵 解決方法二 若專案表都沒主鍵,把 edmx檔案裡面 包含 的語句刪除即可 很費時 當使用沒有主鍵的表完成ef對映時,會將其視為檢視。由於檢視是邏輯實體,因此無法更新。因此,要麼將丟失的主鍵新增到表中,要麼將它們視為檢視,並且不對它們執行任何更新操作。如果...