Spring MyBatis Cassandra结果集地图

Spring MyBatis Cassandra结果集地图,spring,cassandra,mybatis,Spring,Cassandra,Mybatis,我们使用MyBatis Spring来管理DBMS事务(Cassandra)。在Cassandra中,我们有一个定义了映射列的表,该列用作分区键(我们的键必须是复杂类型,因此更改它不是一个选项) 然而,当通过MyBatis执行此操作时,我没有得到任何结果。查询没有抛出任何异常,我可以清楚地看到MyBatis框架日志中的查询与我在cqlsh提示符中使用的查询相匹配 01/11/2017 14:35:24:644 [DEBUG] getSetForName - ==> Preparing:

我们使用MyBatis Spring来管理DBMS事务(Cassandra)。在Cassandra中,我们有一个定义了映射列的表,该列用作分区键(我们的键必须是复杂类型,因此更改它不是一个选项)

然而,当通过MyBatis执行此操作时,我没有得到任何结果。查询没有抛出任何异常,我可以清楚地看到MyBatis框架日志中的查询与我在cqlsh提示符中使用的查询相匹配

01/11/2017 14:35:24:644 [DEBUG] getSetForName - ==>  Preparing: SELECT * FROM mykeyspace.mytable WHERE NAME = 'somename' AND LEVEL = {'mykey':'myvalue'} 
01/11/2017 14:35:24:777 [DEBUG] getValueSetForParameterSet - ==> Parameters: 
01/11/2017 14:35:24:890 [DEBUG] getValueSetForParameterSet - <==      Total: 0
01/11/2017 14:35:24:890 [DEBUG] SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22b1651]

版本信息:mybatis spring 1.3、mybatis v3.4.1、spring 4.3.4-RELEASE

当执行带有嵌入式映射文字的cql字符串时,例如
。。。其中level={key2':'value2','key1':'value1}/code>,则将根据键类型按降序重新排序。在本例中,键类型为varchar,因此键将按字母顺序降序排列,区分大小写。插入
{'zbc':'','abc':'','1abc':'','q12':'','abbc':'','abbc':''}
会导致
[1=,1abc=,abbc=,abbc=,abc=,abc=,q12=,zbc=][/code>实际插入

使用绑定参数执行语句时,将保留绑定映射对象中键的顺序。这意味着,如果使用像
HashMap
这样的无序映射结构,则无法保证顺序

比较贴图对象时,顺序很重要。映射条目顺序的差异导致比较失败,并且没有返回结果

您可以通过使用
SortedMap
实现来解决这个问题,例如
TreeMap
,默认情况下,它按字母大小写顺序排列键

SELECT * FROM mykeyspace.mytable where name = 'somename' and level = {'mykey','myvalue'} ;
01/11/2017 14:35:24:644 [DEBUG] getSetForName - ==>  Preparing: SELECT * FROM mykeyspace.mytable WHERE NAME = 'somename' AND LEVEL = {'mykey':'myvalue'} 
01/11/2017 14:35:24:777 [DEBUG] getValueSetForParameterSet - ==> Parameters: 
01/11/2017 14:35:24:890 [DEBUG] getValueSetForParameterSet - <==      Total: 0
01/11/2017 14:35:24:890 [DEBUG] SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22b1651]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.mycompany.mapper.MyMapper">

    <select id="getSetForName" resultType="string" parameterType="map">
        SELECT * FROM MYKEYSPACE.MYTABLE WHERE NAME = '${name}' AND LEVEL = ${level}
    </select>

</mapper>
    private Cluster cluster;
    private Session session;

    public void doQuery(String name, String level) {
      String query = "select * from mykeyspace.mytable where name = '" + name + "' and level = " + level;

     Session s = get Session();
     ResultSet results = s.execute(query);

     for(Row r: results) {
       ...
     }
    }

    private Session getSession() {
      cluster = connectCluster("myhost");
      session = cluster.connect();

      return session;
    }

    private Cluster connectCluster(String node) {
      return Cluster.builder().addContactPoint(node).build();
    }