我以前是仅仅分页,排序是手动赋值的,没有问题:
接口
public List<FuZhuang> showalldescdesc1(@Param("offset") int offset, @Param("limit") int limit);
sql语句
<select id="showalldescdesc1" resultType="FuZhuang" >
SELECT * from fuzhuang order by price desc,yuexiaoliang desc LIMIT #{offset},#{limit};
</select
但是现在想先排序时传入参数(asc、desc):
接口   
public List<FuZhuang> showalldescdesc1(@Param("offset") int offset, @Param("limit") int limit,@Param("str") String str);
sql语句
<select id="showalldescdesc1" resultType="FuZhuang" >
SELECT * from fuzhuang order by price #{str},yuexiaoliang desc LIMIT #{offset},#{limit};
</select>
结果报错了:
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''desc',yuexiaoliang desc LIMIT 6,6' at line 1
### The error may exist in mybatis/mappers/FuZhuangMapper.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT * from fuzhuang order by price ?,yuexiaoliang desc LIMIT ?,?;
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''desc',yuexiaoliang desc LIMIT 6,6' at line 1
; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 ''desc',yuexiaoliang desc LIMIT 6,6' at line 1
org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:233)
org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)
$Proxy10.selectList(Unknown Source)
org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:195)
org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)
org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)
是什么原因啊?难道asc和desc不能以变量的形式传参吗?不会吧?该怎么解决啊!!!求助!!

解决方案 »

  1.   

    <select id="sel_order_s_count" parameterClass="java.util.Map" resultClass="int"></select>
    传入的参数要在select中写明,比如我这里传了一个Map,在sql中就可以引用Map中的数据了
      

  2.   

    ### SQL: SELECT * from fuzhuang order by price ?,yuexiaoliang desc LIMIT ?,?;说明是预处理的,这样的话是不能赋值的;类似于sql注入预处理就可以防止,预处理原理我了解不多,不过真正执行的sql语句 SELECT * from fuzhuang order by price desc,yuexiaoliang desc LIMIT ?,?; 那里绝对不是单纯的desc 要么就是'desc' 或什么的  具有我也了解不多!
      

  3.   

    <select id="showalldescdesc1" resultType="FuZhuang" >
    SELECT * FROM fuzhuang 
    <if test="ORDER == 'desc'">
         ORDER BY price DESC
    </if>
    <if test="ORDER == 'asc'">
        ORDER BY yuexiaoliang ASC
    </if>
    LIMIT #{offset},#{limit};
    </select>
      

  4.   

    SQL语句只有值的地方可以用?,其余地方一律不行,比如table,column,order by clause ,group by clause等。ibatis 用#变量#实现预处理,用$变量$实现事前拼接,mybatis不熟,自己查手册吧。
      

  5.   

    嗯 确实是这样 我一般写parameterType 我试过 有的不写也可以  但是我要是传多个类型的数据时 怎么写啊?比如说要穿两个参数一个是int类型,一个是String类型,parameterType或parameterClass该怎么写呀?如果非要这样的话当然可以把int和String 封装到一个类里面,但是类型多了该怎么办?你如说一个int,两个String,一个user之类的??????
      

  6.   


    可能是我没说清楚,我很打算是同时按照price和xiaoliang排序的,你这样的话只是按照一个条件排序了啊,我想知道能否通过传参数,来决定是升序(asc),还是降序(desc)。。求助
      

  7.   

    <select id="showalldescdesc1" resultType="FuZhuang" > 
    SELECT * FROM fuzhuang  
    <if test="str== 'desc'">      
    ORDER BY price DESC,yuexiaoliang ASC
    </if> 
    <if test="str== 'asc'">     
    ORDER BY price ASC,yuexiaoliang ASC
    </if> 
    LIMIT #{offset},#{limit}; 
    </select>
    试试应该可以
      

  8.   


    我试了下  没有报错了  应该可以  还需要测试下  小弟刚刚学mybatis  动态sql不怎么会用就指教 有没有什么好的视频或者书啊 讲的深一点的   还有mybatis要多传几个参数怎么办?parameterType或parameterClass该怎么写?比如5楼的情况????求指教!!!!
      

  9.   

    还有mybatis的动态sql语句中的if能不能同时满足多个条件啊
    比如说
    <if test="(str== '1')&&(price=='desc')">
    ORDER BY price DESC
    </if>
    我试过  好像只要写&&就会报错
    如果想同时满足两个条件该怎么办呢?
    求解!!!!!!
      

  10.   

    多个参数时传Map类型,然后把要用的数据放到Map中(Map<key,value>),在sql中直接使用#key#就可以使用参数了
      

  11.   


    <if test="str== '1' AND price =='desc' ">
    ORDER BY price DESC
    </if>