文章首發於 https://donlex.cn
一些在使用springcloud和mybatis-plus中遇到的小問題以及解決方法
oracle 列轉行 LISTAGG和WM_CONCAT
對於將一列多值合併成一行問題,oracle提供了wmsys.wm_concat
和listagg
函數處理此問題。但是使用那一個函數具體得看數據庫的版本
WMSYS.WM_CONCAT: 依賴WMSYS用戶
LISTAGG: 11g2才提供的函數,不支持distinct
select listagg(多行轉單行的列,分隔符) within group(order by 按哪一列分組) from tmp t group by 按哪一列分組
用法就像聚合函數一樣,通過Group by語句,把每個Group的一個字段,拼接起來,非常方便
例子:
select * from SONG_INFO ALBUMS_INFO
查出表的數據如圖所示:
現在我需要讓兩行中的名字合併成一行,並用“+”連接起來
select listagg(t.SONG_NAME, '+') within group (order by t.SONG_RD) as BelongSinger
from (select * from SONG_INFO ALBUMS_INFO) t group by t.SONG_RD
結果:
mybatis-plus使用枚舉類型
對於在代碼中定義枚舉類型,最好實現 IEnum
接口,並在配置文件中配置好掃描枚舉類型的位置,否則會報下面的的錯誤。
java.lang.IllegalArgumentException: No enum constant com.content.enums.BusinessType.8
at java.lang.Enum.valueOf(Enum.java:238) ~[na:1.8.0_144]
配置文件設置:
mybatis-plus.configuration.default-enum-type-handler=com.baomidou.mybatisplus.extension.handlers.MybatisEnumTypeHandler
mybatis-plus.type-enums-package=com.content.enums
具體可以參考:mybatis-plus官網
mybatis-plus關鍵字
對於oracle中定義的實體名稱和數據庫中的關鍵字衝突,強烈建議不要使用關鍵字作爲實體名稱,因爲自己使用註解@TableField
,也不一定能夠解決。
比如:我在使用validate
這個關鍵字的時候,就無法正常的解釋過去
oracle序列
在java中使用update,並且主鍵是一個自增序列的話,如果另外有一個程序在批量導入數據,可能會導致休閒主鍵衝突的情況,這就是因爲數據在導入的時候序列已經增長了,但是java代碼還是使用自己原來每增長之前的序列,導致了衝突。
解決辦法:
- 先得到當前的序列
- 獲取數據庫中數據的id最大值
- 設置增長序列下一次增長爲數據庫中id最大值減去當前序列
- 運行一次獲取下一序列值
- 設置序列下一次增長爲1
SELECT seq_t_test.CURRVAL FROM DUAL -- 獲取當前序列值
alter sequence seq_t_test increment by n -- n表示最大id值減去當前序列值
SELECT seq_t_test.NEXTVAL FROM DUAL -- 增長一次
alter sequence seq_t_test increment by 1 -- 設置回每次增長1
SELECT seq_t_test.CURRVAL FROM DUAL
附
參考資料: