weixin_40119478
Zaylour
2018-08-23 02:03
采纳率: 69.2%
浏览 2.3k
已采纳

mybatis中用like的时候,变量是动态的,但是总是多了一个单引号,好奇怪。

public List getmajorscores(String course,String term){//这是调用方法
List list = sMapper.getmajorscores("17会计","2");
return list;
}
在score.java中:
List getmajorscores( String course, String term);
在score.xml中:
select * from scores where s_term = #{1} and s_class like CONCAT('%',#{0},'%') and s_course in(SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%') )

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

9条回答 默认 最新

  • zhangpan_soft
    zhangpan_soft 2018-08-23 02:43
    已采纳

    sql本身如楼上所说,and s_class like CONCAT('%',#{0},'%')这句话不用要,因为你虚表本身就有,说实话,就sql本身而言,楼主将sql写复杂了,
    我们分析一下,SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%')这句话就是查询课程根据班级,而你
    所以整个sql可以翻译为查询信息根据 s_term 并且 根据 班级s_class like CONCAT('%',#{0},'%')(这句)并且根据课程,而课程是怎么查出来的?根据班级SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%'),楼主可以试一下,根本没必要要最后一个and之后的语句,查询出的信息觉对完全一样,也就是2句话说的是一个意思,如果是因为s_cores可能为null导致的可以加一句and s_course is not null,至于为什么觉得让楼主去掉最后一个and之后的,是因为in的效率极其低下我们一般sql能不用in就不用in的,in是全表检循环检索,也就是说,你有1000条数据,in有10个条件,呢么就要检索1000*10次,什么概念?你有百万条数据呢?另外看你贴的错误其是因为17会计真正传过去的时候是'17会计',其暂时我还没看出来,方便的话,将整个xml关于这段贴出来,包含select标签

    点赞 评论
  • sky__fall
    poor coder 2018-08-23 02:14

    没有语法错误,但是你得sql语句写重复了 不需要下面这句: and s_course in(SELECT DISTINCT s_course from scores where s_class like CONCAT('%',#{0},'%') )

    点赞 评论
  • weixin_40119478
    Zaylour 2018-08-23 02:17

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%'17会计'%' at line 1
    忘记放上去错误了,在变量那里&多了一个‘

    点赞 评论
  • sky__fall
    poor coder 2018-08-23 02:32

    建议试一下:
    List getmajorscores( String course, String term); 这句改成List getmajorscores( @Param("course")String course, @Param("term")String term);

    #{1} 改成 #{term} #{0} 改成 #{course}

    另外 in 后半句确实没用,子查询和外面的查询都是从一张表查?那还搞个子查询干嘛

    点赞 评论
  • u014794644
    瓦史托德 2018-08-23 02:33

    图片说明
    #{}是带引号的吧,拼接会报错,?就没错。

    点赞 评论
  • tongkaiming
    tongkaiming 2018-08-23 02:35
     select * from scores where s_term = #{1} and 
    <bind name="pattern" value="'%"+#{0} +" %'" />
    s_class like #{pattern}
    and s_course in(SELECT DISTINCT s_course from scores where s_class like  #{pattern})
    
    点赞 评论
  • sky__fall
    poor coder 2018-08-23 02:40

    图片说明

    点赞 评论
  • zhangpan_soft
    zhangpan_soft 2018-08-23 03:01

    补充一点,我们在用模糊的时候,很少如楼主呢让用,我们一般是在业务层拼接好传过去的,也就是在service中已经拼接成%17会计%,然后将这个传入sql,在sql中就变为了like #{...},

    点赞 评论
  • zhaomin_g
    _zming 2018-08-23 04:35

    把#{0}换成${0}试试应该可以

    点赞 评论

相关推荐