1. 程式人生 > >Spring cloud Jpa 的三種複合主鍵查詢(實體類操作,sql語句裡操作)

Spring cloud Jpa 的三種複合主鍵查詢(實體類操作,sql語句裡操作)

    今天剛好有個sql查詢,查出來的時候發現數據重複(可能說是覆蓋了更為準確些)了,條數是對的,再去debug一遍,發現是jpa自定義的實體類那裡出了問題,主鍵id只有一個,因為查出來的資料是複合主鍵的,所以只找到了實體類中定義的一個ID,可能就導致了資料覆蓋,但是條數是正確的,然後自己在sql理處理,寫了一種方式來處理這個複合主鍵,然後上網看了一些資料之後原來還有其他方式來處理複合主鍵的,主要是在實體類裡使用相關注解,還有新建一個類用來存放符合主鍵的欄位,不過我懶,所以就沒用網上的方式來處理了,直接用自己的方式在sql語句裡處理,懶得又新建一個類,因為就只用一次,所以下面也大概總結講一下三種複合主鍵查詢的方法(前面兩種是看網上說的常用方法):

 

1,使用註解@[email protected]組合(也叫嵌入式主鍵),這個方式主要是新建一個複合主鍵類,然後用@Embeddable來宣告這個類是複合主鍵類,接著在自己定義的另外一個新類中可以繼承這個複合類,也可以直接把這個類宣告為其中一個屬性,在Repository中把這個複合類作為主鍵返回就行了(繼承的時候返回的主鍵);用@EmbeddedId來聲明覆合主鍵的一個id列,@AttributeOverrides是對映到複合類對應的列的註解

 

2,使用註解@IdClass(複合類.class)[email protected][email protected]

組合在自定義的實體類中宣告

以上的兩種方法都是在實體類裡操作的,都是網上看到的方法,也沒怎麼詳細研究,是可行的,下面的第三種方法是直接在SQL語句裡操作的:

 

3,直接在sql語句裡操作,把複合主鍵字串連線起來就可以作為一個唯一的主鍵了,用別名id返回,對應實體類中宣告的id列;這種方法挺侷限的,對於一些多主鍵的也不好操作,所以還有一種方式就是在sql裡用變數生成一個排序號,把這個排序號作為id列返回就好了,如下(宣告的變數@i :=0,注意轉移字元:號,直接用雙斜杆轉義\\:):

            僅代表個人觀點,歡迎各位大佬隨時指點,謝謝!

                                                                                                                                                                            2019年01月07日