Aganstrong 2021-06-17 19:16 采纳率: 56.6%
浏览 136
已结题

一个mybatis查询排序问题

前端传递排序的字段(对应的是实体的属性,与数据库实际字段不一样的)及排序方式,后端如何动态处理映射成对应数据库字段查询,mybatis逆向工程生成的查询

  • 写回答

6条回答 默认 最新

  • Aganstrong 2021-06-18 15:59
    关注

    弄了套解决方案:

    1、applicationContext配置bean

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

    2、SqlSessionTemplateUtils.java

    
    import org.apache.ibatis.mapping.ResultMap;
    import org.apache.ibatis.mapping.ResultMapping;
    import org.mybatis.spring.SqlSessionTemplate;
    
    public class SqlSessionTemplateUtils {
    
        /**
         * 获取指定mapper定义好的映射关系
         * 
         * @param sqlSessionTemplate
         * @param clazzName
         * @return
         */
        public static ResultMap getBaseResultMap(SqlSessionTemplate sqlSessionTemplate, String clazzName) {
            assert sqlSessionTemplate != null;
            return sqlSessionTemplate.getConfiguration().getResultMap(clazzName + ".BaseResultMap");
        }
    
    
        /**
         * 根据实体类的属性名获取对应的数据表的字段列名
         *
         * @param property 属性名
         * @param clazz    实体类
         * @return 字段名
         */
        public static String property2Field(SqlSessionTemplate sqlSessionTemplate, String property, Class<?> clazz) {
            ResultMap resultMap = getBaseResultMap(sqlSessionTemplate, clazz.getName());
            if (resultMap != null) {
                for (ResultMapping resultMapping : resultMap.getPropertyResultMappings()) {
                    if (resultMapping.getProperty().equals(property)) {
                        property = resultMapping.getColumn();
                        return property;
                    }
                }
            }
            //没有找到映射信息,将使用驼峰命名法转换下划线属性名
            return camelToUnderline(property, false);
        }
    
        private static final String UNDERLINE = "_";
        /**
         * 驼峰转下划线
         *
         * @param param     字符串
         * @param upperCase 是否全大写
         * @return 结果
         */
        public static String camelToUnderline(String param, boolean upperCase) {
            if (param == null || "".equals(param.trim())) {
                return "";
            }
            int len = param.length();
            StringBuilder sb = new StringBuilder(len);
            for (int i = 0; i < len; i++) {
                char c = param.charAt(i);
                if (Character.isUpperCase(c)) {
                    sb.append(UNDERLINE);
                }
                if (upperCase) {
                    //统一都转大写
                    sb.append(Character.toUpperCase(c));
                } else {
                    //统一都转小写
                    sb.append(Character.toLowerCase(c));
                }
            }
            return sb.toString();
        }
    
    
    }
    

    3、在serviceImpl:

    @Resource(name = "sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;
    
    
    @Override
    public PageResult<Commodity> getCommodityStoreListByCondition(PageResult<Commodity> page) {
        CommodityExample example = new CommodityExample();
        if (StringUtils.isNotEmpty(page.getOrderBy())) {
            String[] orderBy = page.getOrderBy().split(" ");  // DESC
            String field = SqlSessionTemplateUtils.property2Field(sqlSessionTemplate, orderBy[0].trim(), CommodityMapper.class);
            if ("zomore_commodity_in".equals(field) || "zomore_commodity_out".equals(field) || "zomore_commodity_outall".equals(field)) {
                field = "cast(" + field + " as DECIMAL(10, 2))";
            }
            if (dd.length > 1) {
                field = field + " " + orderBy[1];
            }
            example.setOrderByClause(field);
        }
        ...
    }

    跑通了,请教一下会不会有什么毛病???

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 8月20日
  • 已采纳回答 8月12日

悬赏问题

  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 Revit2020下载问题
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 单片机无法进入HAL_TIM_PWM_PulseFinishedCallback回调函数
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch