mybatis-plus的一些tips

一些在使用springcloudmybatis-plus中遇到的小问题以及解决方法

oracle 列转行 LISTAGG和WM_CONCAT

对于将一列多值合并成一行问题,oracle提供了wmsys.wm_concatlistagg函数处理此问题。但是使用那一个函数具体得看数据库的版本

WMSYS.WM_CONCAT: 依赖WMSYS用户

LISTAGG: 11g2才提供的函数,不支持distinct


1
select listagg(多行转单行的列,分隔符) within group(order by 按哪一列分组) from tmp t group by 按哪一列分组

用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来,非常方便

例子:

1
select * from SONG_INFO ALBUMS_INFO

查出表的数据如图所示:
SQLfirst.png
现在我需要让两行中的名字合并成一行,并用“+”连接起来

1
2
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

结果:
SQLSecond.png

mybatis-plus使用枚举类型

对于在代码中定义枚举类型,最好实现 IEnum 接口,并在配置文件中配置好扫描枚举类型的位置,否则会报下面的的错误。

1
2
java.lang.IllegalArgumentException: No enum constant com.content.enums.BusinessType.8
at java.lang.Enum.valueOf(Enum.java:238) ~[na:1.8.0_144]

配置文件设置:

1
2
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这个关键字的时候,就无法正常的解释过去

关键字.png

oracle序列

在java中使用update,并且主键是一个自增序列的话,如果另外有一个程序在批量导入数据,可能会导致休闲主键冲突的情况,这就是因为数据在导入的时候序列已经增长了,但是java代码还是使用自己原来每增长之前的序列,导致了冲突。

解决办法:

  1. 先得到当前的序列
  2. 获取数据库中数据的id最大值
  3. 设置增长序列下一次增长为数据库中id最大值减去当前序列
  4. 运行一次获取下一序列值
  5. 设置序列下一次增长为1
1
2
3
4
5
6
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

参考资料:

0%