首页 文章

MyBatis Cassandra结果集 Map

提问于
浏览
1

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

CREATE TABLE mykeyspace.mytable ( name text, level frozen<map<text,text>>, effective_ts timestamp ... PRIMARY KEY ((name, level), effective_ts))

如果我在csqlsh中执行对Cassandra的查询,如下所示,我得到一个结果(即预期的正确结果集) .

SELECT * FROM mykeyspace.mytable where name = 'somename' and level = {'mykey','myvalue'} ;

但是,当通过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]

另一个注意事项我试图使用DataStax驱动程序核心(即执行没有MyBatis的查询)并获得预期的结果集 . 因此,我的问题必须与MyBatis有关,但此时我已经用尽了所有想法 . 有什么想法或建议吗?

供参考...... Mapper配置......

<?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>

供参考......使用DataStax核心API ...

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();
    }

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

1 回答

  • 2

    执行带有嵌入式映射文字的cql字符串(例如 ... where level = {'key2':'value2', 'key1':'value1'} )时,将根据键类型按降序对键进行重新排序 . 在这种情况下,密钥类型是varchar,因此密钥将按字母顺序降序排列区分大小写 . 实际插入 {'zbc':'', 'abc':'', '1':'', '1abc':'', 'q12':'', 'abbc':'', 'Abbc':''} 时插入 {'zbc':'', 'abc':'', '1':'', '1abc':'', 'q12':'', 'abbc':'', 'Abbc':''} 结果 .

    使用绑定参数执行语句时,将保留绑定映射对象中键的顺序 . 这意味着如果您使用像 HashMap<K, V> 这样的无序 Map 结构,则无法保证订单 .

    比较 Map 对象时,订单很重要 . 映射条目顺序的差异导致比较失败,并且不返回任何结果 .

    您可以使用 SortedMap<K,V> 实现来解决此问题,例如 TreeMap<K,V> ,默认情况下,按字母顺序区分键区分大小写 .

相关问题