我在尝试使用jdbc驱动程序将uuid插入Cassandra1.2时遇到了一个异常。代码如下:
UUID uuid = java.util.UUID.randomUUID();
PreparedStatement statement = c.prepareStatement("insert into tree (tree_id) values (?)");
statement.setObject(1, uuid);
statement.execute();
我得到一个例外:
java.sql.SQLNonTransientException: encountered object of class: class java.util.UUID, but only 'String' is supported to map to the various VARCHAR types
at org.apache.cassandra.cql.jdbc.HandleObjects.makeBadMapping(HandleObjects.java:124)
at org.apache.cassandra.cql.jdbc.HandleObjects.makeBytes(HandleObjects.java:391)
at org.apache.cassandra.cql.jdbc.CassandraPreparedStatement.setObject(CassandraPreparedStatement.java:351)
at org.apache.cassandra.cql.jdbc.CassandraPreparedStatement.setObject(CassandraPreparedStatement.java:338)
at CassandraTest.main(CassandraTest.java:26)
这是我的模式:
CREATE TABLE browse.tree (tree_id UUID PRIMARY KEY, activation_time TIMESTAMP, tree_lock_id INT, sql_publication_id INT);
有点奇怪,它认为我的uuid字段是varchar。任何帮助都将不胜感激。谢谢!
3条答案
按热度按时间b1uwtaje1#
吉尔伯托是对的。使用此功能:
将uuid转换为byte array,然后ps.setobject(index、byte\u array、types.varbinary)也可以工作
vc9ivgsu2#
您可以使用模式内省来解决这个限制。
我的table:
创建表test_键(pk uuid,text varchar,primary key(pk));
我的自省:
我的刀:
我的驱动程序:cassandra-jdbc-1.2.5.jar
吉尔伯托·维埃拉·达席尔瓦
wsxa1bj13#
uuid不是java.sql.types规范的一部分。我的理解是,正确的行为应该是驱动程序抛出sqlexception。或者,它可以稍微改变一下规则,然后接受它。
作为一种解决方法,uuid的字符串表示应该可以工作,但我确实建议使用本机cql驱动程序而不是jdbc。您不会遇到任何这些规范不匹配的情况,而且它在处理故障转移和负载平衡等方面做得更好。