Xanax不上头 2021-12-28 09:28 采纳率: 60%
浏览 47
已结题

getBoundSql()传入List类型参数报错

前台想在查询数据的同时或之前获取查询数据的sql,于是想用getBoundSql来获取拼完参数的sql,但是传入参数类型为List的时候,总是报错,String和int类型可以正常返回。
这是代码

            List<String> list = new ArrayList<>();
            list.add("1234");
            list.add("5678567");
            list.add("12564534");
            String sql = sqlSessionFactory.getConfiguration().getMappedStatement("com.mapper.ConfigDOMapper.getTest").getBoundSql(list).getSql();
            System.out.println(sql);

报错信息

java.lang.UnsupportedOperationException: null

    at org.apache.ibatis.reflection.wrapper.CollectionWrapper.get(CollectionWrapper.java:38)

    at org.apache.ibatis.reflection.MetaObject.getValue(MetaObject.java:122)

    at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextMap.get(DynamicContext.java:102)

    at org.apache.ibatis.scripting.xmltags.DynamicContext$ContextAccessor.getProperty(DynamicContext.java:113)

    at org.apache.ibatis.ognl.OgnlRuntime.getProperty(OgnlRuntime.java:3338)

    at org.apache.ibatis.ognl.ASTProperty.getValueBody(ASTProperty.java:121)

    at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

    at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)

    at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:50)

    at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

    at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258)

    at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:560)

    at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:524)

    at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46)

    at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)

  • 写回答

3条回答 默认 最新

  • 大鹏cool Java领域优质创作者 2021-12-28 09:50
    关注

    思路是对的,但是参数有问题,MappedStatement#getBoundSql 方法的参数是 mybatis 内部对 mapper 接口方法参数封装后的。正确获取 SQL 的示例代码如下。

    @Component
    public class TestCommandLiner implements CommandLineRunner {
    
        @Autowired
        private SqlSession sqlSession;
    
        @Override
        public void run(String... args) throws Exception {
            
            Configuration configuration = sqlSession.getConfiguration();
            
            // 先查找 Mapper 接口方法
            Method method = ReflectionUtils.findMethod(YysUserDao.class, "getByUserId", Integer.class);
            // 然后创建 mybatis 内部的方法签名对象
            MapperMethod.MethodSignature methodSignature = new MapperMethod.MethodSignature(configuration, YysUserDao.class, method);
            // 然后将正常调用的方法参数列表转换为 mybatis 内部的参数值
            Object arg = methodSignature.convertArgsToSqlCommandParam(Collections.singleton(1L).toArray());
            
            // 然后再获取执行的 SQL
            String sql = configuration.getMappedStatement(YysUserDao.class.getName() + "." + method.getName()).getBoundSql(arg).getSql();
            System.out.println(sql);
        }
    }
    

    如果有帮助,麻烦题主动动小手给个采纳。

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

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月28日

悬赏问题

  • ¥15 r语言神经网络自变量重要性分析
  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢