一些在使用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