当前使用版本(必填,否则不予处理)
3.3.1.tmp
该问题是如何引起的?(确定最新版也有问题再提!!!)
ITableNameHandler的process默认替换使用replaceAll将原表名替换成新表名,如果有两个表t_user和t_userrole,在替换t_user时会将t_userrole也替换了,导致t_userrole再替换时,后缀会替换错误
重现步骤(如果有就写完整)
1.表名t_user和t_userrole 2.原sql语句:select a. from t_user a join t_userrole b on b.userid = a.gid 3.替换后的sql语句: select a. from t_user_2019 a join t_user_2019role b on b.userid = a.gid 4.期望替换后的sql语句: select a. from t_user_2019 a join t_userrole_2019* b on b.userid = a.gid
5.建议默认实现使用正则替换,表名前后有空格或有.时才替换。要不大家都得自己实现process来自定义替换,有违牛B库共用代码的初忠。
报错信息
Comment From: qin4zhang
在mybatisplus的使用中,通过lambda的查询方式,如何获取到参数呢?比如 id这种很明确的字段,所对用的值?方便在动态替换表名
Comment From: qmdx
注意事项:
原理为解析替换设定表名为处理器的返回表名,表名建议可以定义复杂一些避免误替换 例如:真实表名为 user 设定为 mp_dt_user 处理器替换为 user_2019 等
也就是说你的实体注解可以复杂一些例如: @TableName("t_dt_user") 中间参杂 dt 动态替换,然后避免真实表和虚拟命名重合
https://mybatis.plus/guide/dynamic-table-name-parser.html
Comment From: bingxueyinlian
3.3.2版本已改为正则替换,正则表达式为:regex = "(?<=\\s)\\Q" + tableName + "\\E(?=\\s)";
非常感谢。。。
另外建议兼容以下几种情况:
1.以表名结尾
以下t_user后边没东西了(没空白,就算加上空白好像也被剔除掉了,所以无法匹配上)
select * from t_user
2.insert语句
insert语句的表名后直接跟左小括号,没有空白
insert into t_user(id,name) values('1','zhangsan')
3.select子语句
select子语句的表名后直接跟右小括号,没有空白
select a.*,
(select count(1) from t_xxx) as cnt
from t_user a
4.以下正则仅供参考:
regex = "(?<=\\s)\\Q" + tableName + "\\E(?=\\s|\\(|\\)|$)
@qmdx
Comment From: skyl4537
在mybatisplus的使用中,通过lambda的查询方式,如何获取到参数呢?比如 id这种很明确的字段,所对用的值?方便在动态替换表名
也有同样的需求,根据某个固定字段 xId 的值进行动态表名...
Comment From: bingxueyinlian
@skyl4537 @qin4zhang 请给出具体示例步骤,方便大家讨论
Comment From: cn-sanxs
truncate table tbl_fcl_ins_acct_dtl 这正则表达式简单的替换都无法完成...
Comment From: hcl04
ok,我们已经将空白检测,修改为单词边界检测,感谢您的建议
(?<=\\b)\\Q" + tableName + "\\E(?=\\b)
Comment From: hcl04
正则表达式不能很好地处理动态表名,下个版本我们将采用船新的方式进行处理
Comment From: lunxian8
同问mp使用,通过lambda的查询或者修改,如何获取到参数呢? 例如:动态表名我需要根据一个tag的字段作为规则;
使用:
testService.lambdaQuery().eq(TestData::getTag, "A").like(TestData::getValue,"te").list();
Object paramObj = metaObject.getValue("delegate.boundSql.parameterObject");
拿到ew后怎么去获取字段名,值?
现在的做法是通过entity去获取到的
testService.lambdaQuery().setEntity(new TestData().setTag("A")).list();
ew:
if (arg instanceof Wrapper) {
if (((Wrapper) arg).getEntity() instanceof ShardEntity) {
tagValue = ((ShardEntity) ((Wrapper) arg).getEntity()).getTagValue();
break;
}
}
求大佬介绍一个好的玩法!!!
Comment From: qmdx
请使用 3.4.0 有问题再打开