当前位置: 首页 > news >正文

瓯海网站建设承德信息发布微信平台

瓯海网站建设,承德信息发布微信平台,o2o网站建设代理商,搜索引擎关键词优化方案背景 最近碰上有个业务#xff0c;查询的sql如下#xff1a; select * from table where (sku_id,batch_no) in ((#{skuId},#{batchNo}),...); 本来也没什么#xff0c;很简单常见的一种sql。问题是我们使用的是mybatis-plus#xff0c;然后写的时候又没有考虑到后面的查…背景 最近碰上有个业务查询的sql如下 select * from table where (sku_id,batch_no) in ((#{skuId},#{batchNo}),...); 本来也没什么很简单常见的一种sql。问题是我们使用的是mybatis-plus然后写的时候又没有考虑到后面的查询条件这里用的是mybatis-plus lambda的方式。 LambdaQueryChainWrapperTable query tableService.lambdaQuery(); query.eq(Table::getId, param.getId()); 但是mysql-plus并没有支持这种sql的形式要么用apply方法自定义拼接sql要么不采用lambda方式将语句写成 xml 形式。 不过第一种方式感觉很 low一大段 java 代码里插入一段sql字符串看上去就很别扭因为有点代码洁癖只能果断放弃。 第二种改动又太大前面那么多查询条件又要全部移入xml里面同时本来已经通过测试的筛选条件又要重新来一遍太懒实在干不动了。 想想这么常见的场景网上理应有现成的解决方案。但不知道是搜索关键字不对还是确实没有搜了半天没搜出来。 最后无奈只能尝试自己扩展一下。 代码 import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper; import com.baomidou.mybatisplus.core.conditions.ISqlSegment; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import io.vavr.Tuple; import org.springframework.util.Assert;import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; import java.util.stream.Collectors;import static com.baomidou.mybatisplus.core.enums.SqlKeyword.IN; import static java.util.stream.Collectors.joining;public class CombinationLambdaQueryChainWrapperT extends AbstractLambdaWrapperT, CombinationLambdaQueryChainWrapperT {/*** 查询字段*/private String sqlSelect;public CombinationLambdaQueryChainWrapper() {this(null);}public CombinationLambdaQueryChainWrapper(T entity) {this.entity entity;this.initEntityClass();this.initNeed();}CombinationLambdaQueryChainWrapper(T entity, ClassT entityClass, String sqlSelect, AtomicInteger paramNameSeq, MapString, Object paramNameValuePairs,MergeSegments mergeSegments) {this.entity entity;this.paramNameSeq paramNameSeq;this.paramNameValuePairs paramNameValuePairs;this.expression mergeSegments;this.sqlSelect sqlSelect;this.entityClass entityClass;}/*** p* SELECT 部分 SQL 设置* /p** param columns 查询字段*/SafeVarargspublic final CombinationLambdaQueryChainWrapperT select(SFunctionT, ?... columns) {if (ArrayUtils.isNotEmpty(columns)) {this.sqlSelect this.columnsToString(columns);}return typedThis;}public CombinationLambdaQueryChainWrapperT select(PredicateTableFieldInfo predicate) {return select(entityClass, predicate);}/*** p* 过滤查询的字段信息(主键除外!)* /p* p* 例1: 只要 java 字段名以 test 开头的 - select(i - i.getProperty().startsWith(test))* 例2: 只要 java 字段属性是 CharSequence 类型的 - select(TableFieldInfo::isCharSequence)* 例3: 只要 java 字段没有填充策略的 - select(i - i.getFieldFill FieldFill.DEFAULT)* 例4: 要全部字段 - select(i - true)* 例5: 只要主键字段 - select(i - false)* /p** param predicate 过滤方式* return this*/public CombinationLambdaQueryChainWrapperT select(ClassT entityClass, PredicateTableFieldInfo predicate) {this.entityClass entityClass;this.sqlSelect TableInfoHelper.getTableInfo(getCheckEntityClass()).chooseSelect(predicate);return typedThis;}Overridepublic String getSqlSelect() {return sqlSelect;}/*** p* 用于生成嵌套 sql* 故 sqlSelect 不向下传递* /p*/Overrideprotected CombinationLambdaQueryChainWrapperT instance(AtomicInteger paramNameSeq, MapString, Object paramNameValuePairs) {return new CombinationLambdaQueryChainWrapper(entity, entityClass, null, paramNameSeq, paramNameValuePairs, new MergeSegments());}/*** 组合IN查询* 此处引入元祖需使用io.vavr包**/public CombinationLambdaQueryChainWrapperT combinationIn(boolean condition, ListTuple list, SFunctionT, ?... columns) {Assert.isTrue(columns.length list.get(0).arity(), 请检查组合IN查询参数长度);return doIt(condition,() - StringPool.LEFT_BRACKET columnsToString(columns) StringPool.RIGHT_BRACKET,IN,inExpressionOfParam(list));}private ISqlSegment inExpressionOfParam(ListTuple list) {if (list.size() 1000) {throw new RuntimeException(组合查询禁止超过1000条);}ListString result list.stream().map(m - StringPool.LEFT_BRACKET m.toSeq().asJava().stream().map(n - n instanceof String ? StringPool.SINGLE_QUOTE n StringPool.SINGLE_QUOTE : String.valueOf(n)).collect(Collectors.joining(StringPool.COMMA)) StringPool.RIGHT_BRACKET).collect(Collectors.toList());return () - result.stream().collect(joining(StringPool.COMMA, StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET));}}使用示例 productRelService.list(new CombinationLambdaQueryChainWrapperProductRel().select(ProductRel::getLevelId).eq(ProductRel::getLevelId, GBZ0555A0002).combinationIn(true, Arrays.asList(Tuple.of(91cf1c0f3b0bc46e0238dc33717dc88e, GBZ0555A0002)), ProductRel::getProductUuid, ProductRel::getLevelId));productRelService.list(new CombinationLambdaQueryChainWrapperProductRel().combinationIn(true, Arrays.asList(Tuple.of(1L, GBZ0555A0002)), ProductRel::getId, ProductRel::getLevelId));
http://www.hkea.cn/news/14543866/

相关文章:

  • 住房和建设部信息网站wordpress 创建自定义面板类文件
  • 网站开发如何给用户发邮件wordpress数据卡
  • 如何提升网站知名度网片排焊机
  • 怎么做一个公司网站广州网站开发系统
  • 怎样建设一个好的企业网站被执行人信息查询
  • 宿州市住房 建设 官方网站自学黑客编程入门
  • 青岛网站建设搜q.479185700福建有没有网站做一件代发
  • 南宁网站建设教学网站怎么提升百度收入
  • 网站开发与管理实训项目网站底部关键词指向
  • 制作企业网站用什么软件php网站开发概念
  • 东莞响应式网站flash 学习网站
  • 什么是网站开发技术网站分析数据
  • 轻淘客 轻网站怎么做微信公众号链接的网站怎么做的
  • 北京设计网站的公司有做直播网网站的公司没有
  • 网站源码设计一级做爰片a视频网站
  • 哪家做网站做得好互联网网站建设方案
  • 微网站开发流程图wordpress淘宝客主题模板
  • 网站备案与icp备案竞价网站做seo
  • 东莞建设专业网站企业做网站要注意哪些
  • 南京做网站seo用python做网站优点
  • 深圳网站seo优化排名公司鄂州网站建设网络公司
  • 知名的网站开发公司WordPress搬家文章404
  • 做网站需要前置审批永兴网站开发
  • 如果在网上接网站建设项目wordpress 判断用户
  • 全网平台整合营销推广嘉兴seo计费管理
  • 要建设一个网站需要什么手续费电话销售做网站
  • 廊坊建设公司网站网站建设的界面f分
  • 广州营销型网站建设怎么样晋江网站建设哪家好
  • 建设文化产业网站的方案hao123主页我的上网主页
  • 怎么做外贸企业网站请人做个网站多少钱