Java 如何解决cassandra中不匹配的列名/值?
我在cassandra表中插入了一组数据。但是我在其中得到了不匹配的列名/值。我发布了代码和表结构Java 如何解决cassandra中不匹配的列名/值?,java,cassandra,cql,Java,Cassandra,Cql,我在cassandra表中插入了一组数据。但是我在其中得到了不匹配的列名/值。我发布了代码和表结构 public static void aMethod2FromData(DetailsVO detailsVO) { System.out.println(detailsVO.getA_no()); StringBuilder sb = new StringBuilder(); int num = (int) (Math.random() * 8847); i
public static void aMethod2FromData(DetailsVO detailsVO) {
System.out.println(detailsVO.getA_no());
StringBuilder sb = new StringBuilder();
int num = (int) (Math.random() * 8847);
int radar = (int) (Math.random() * 847);
sb.append(
"INSERT INTO CALL_RATIO_ANALYSYS (A_NO,JAN,FEB,MAR,APR,MAY,JUNE,JULY,AUG,SEP,OCT,NOV,DEC,RADAR_VOICE,RADAR_SMS,RADAR_MMS,RADAR_GPRS,RADAR_OTHER,MMS_INCOMING,MMS_OUTGOING,VOICE_INCOING,VOICE_OUTGOING,SMS_INCOMING,SMS_OUTGOING,GPRS_SOCIAL,GPRS_MAIL,GPRS_GOOGLE,GPRS_ENTERTAINMENT,GPRS_BUSINESS)")
.append("VALUES(");
sb.append("'").append(detailsVO.getA_no()).append("',");
//calculation for Jan to dec
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
//end here
//start calculation of radar
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//mms incoming
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//voice incoming outgoing
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//end here
//sms incoming outgoing
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//gprs calculation
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("')");
//ends here
System.out.println(sb.toString());
String cql = sb.toString();
session.execute(cql);
}
CREATE TABLE CALL_RATIO_ANALYSYS(
A_NO TEXT,
JAN TEXT,
FEB TEXT,
MAR TEXT,
APR TEXT,
MAY TEXT,
JUNE TEXT,
JULY TEXT,
AUG TEXT,
SEP TEXT,
OCT TEXT,
NOV TEXT,
DEC TEXT,
RADAR_VOICE TEXT,
RADAR_SMS TEXT,
RADAR_MMS TEXT,
RADAR_GPRS TEXT,
RADAR_OTHER TEXT,
MMS_INCOMING TEXT,
MMS_OUTGOING TEXT,
VOICE_INCOMING TEXT,
VOICE_OUTGOING TEXT,
SMS_INCOMING TEXT,
SMS_OUTGOING TEXT,
GPRS_SOCIAL TEXT,
GPRS_MAIL TEXT,
GPRS_GOOGLE TEXT,
GPRS_ENTERTAINING TEXT,
GPRS_BUSINESS TEXT,
PRIMARY KEY(A_NO)
);
这是表结构
public static void aMethod2FromData(DetailsVO detailsVO) {
System.out.println(detailsVO.getA_no());
StringBuilder sb = new StringBuilder();
int num = (int) (Math.random() * 8847);
int radar = (int) (Math.random() * 847);
sb.append(
"INSERT INTO CALL_RATIO_ANALYSYS (A_NO,JAN,FEB,MAR,APR,MAY,JUNE,JULY,AUG,SEP,OCT,NOV,DEC,RADAR_VOICE,RADAR_SMS,RADAR_MMS,RADAR_GPRS,RADAR_OTHER,MMS_INCOMING,MMS_OUTGOING,VOICE_INCOING,VOICE_OUTGOING,SMS_INCOMING,SMS_OUTGOING,GPRS_SOCIAL,GPRS_MAIL,GPRS_GOOGLE,GPRS_ENTERTAINMENT,GPRS_BUSINESS)")
.append("VALUES(");
sb.append("'").append(detailsVO.getA_no()).append("',");
//calculation for Jan to dec
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
sb.append("'").append(num).append("',");
//end here
//start calculation of radar
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//mms incoming
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//voice incoming outgoing
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//end here
//sms incoming outgoing
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
//ends here
//gprs calculation
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("',");
sb.append("'").append(radar).append("')");
//ends here
System.out.println(sb.toString());
String cql = sb.toString();
session.execute(cql);
}
CREATE TABLE CALL_RATIO_ANALYSYS(
A_NO TEXT,
JAN TEXT,
FEB TEXT,
MAR TEXT,
APR TEXT,
MAY TEXT,
JUNE TEXT,
JULY TEXT,
AUG TEXT,
SEP TEXT,
OCT TEXT,
NOV TEXT,
DEC TEXT,
RADAR_VOICE TEXT,
RADAR_SMS TEXT,
RADAR_MMS TEXT,
RADAR_GPRS TEXT,
RADAR_OTHER TEXT,
MMS_INCOMING TEXT,
MMS_OUTGOING TEXT,
VOICE_INCOMING TEXT,
VOICE_OUTGOING TEXT,
SMS_INCOMING TEXT,
SMS_OUTGOING TEXT,
GPRS_SOCIAL TEXT,
GPRS_MAIL TEXT,
GPRS_GOOGLE TEXT,
GPRS_ENTERTAINING TEXT,
GPRS_BUSINESS TEXT,
PRIMARY KEY(A_NO)
);
我无法理解列与数据不匹配的位置。请帮助我建议您使用准备好的语句。这不是问题的直接解决方案,但不应该像那样构建CQL语句。它效率低下,代码也变得一团糟。可能缺少逗号或其他内容,但尝试检查代码的语法要比使用准备好的语句重写代码花费更多的时间:
PreparedStatement statement = session.prepare("INSERT INTO CALL_RATIO_ANALYSYS (A_NO,JAN,FEB,MAR,APR,MAY,JUNE,JULY,AUG,SEP,OCT,NOV,DEC,RADAR_VOICE,RADAR_SMS,RADAR_MMS,RADAR_GPRS,RADAR_OTHER,MMS_INCOMING,MMS_OUTGOING,VOICE_INCOING,VOICE_OUTGOING,SMS_INCOMING,SMS_OUTGOING,GPRS_SOCIAL,GPRS_MAIL,GPRS_GOOGLE,GPRS_ENTERTAINMENT,GPRS_BUSINESS) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
BoundStatement boundStatement = statement.bind(detailsVO.getA_no(), num, num, num, num, num, num, num, num, num, num, num, num, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar);
session.execute(boundStatement);
保留准备好的声明并重复使用
编辑所以这里真正的问题是您缺少最后一个参数的值。如果错误消息显示值的数量错误,那么计算值会有所帮助。我建议您使用预先准备好的语句。这不是问题的直接解决方案,但不应该像那样构建CQL语句。它效率低下,代码也变得一团糟。可能缺少逗号或其他内容,但尝试检查代码的语法要比使用准备好的语句重写代码花费更多的时间:
PreparedStatement statement = session.prepare("INSERT INTO CALL_RATIO_ANALYSYS (A_NO,JAN,FEB,MAR,APR,MAY,JUNE,JULY,AUG,SEP,OCT,NOV,DEC,RADAR_VOICE,RADAR_SMS,RADAR_MMS,RADAR_GPRS,RADAR_OTHER,MMS_INCOMING,MMS_OUTGOING,VOICE_INCOING,VOICE_OUTGOING,SMS_INCOMING,SMS_OUTGOING,GPRS_SOCIAL,GPRS_MAIL,GPRS_GOOGLE,GPRS_ENTERTAINMENT,GPRS_BUSINESS) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
BoundStatement boundStatement = statement.bind(detailsVO.getA_no(), num, num, num, num, num, num, num, num, num, num, num, num, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar, radar);
session.execute(boundStatement);
保留准备好的声明并重复使用
编辑所以这里真正的问题是您缺少最后一个参数的值。如果错误消息说您的值数错误,那么计算值会有所帮助。Afaik,默认情况下cql3不区分大小写,除非您引用所有内容。如果您发布收到的错误消息,则会有所帮助。我投票决定关闭,我认为在你要求别人为你计数之前,你应该表明你已经做了一些最少量的工作来试图理解这个问题。如果计算机告诉你没有足够的值,数一数你的值,看看它们是否相加。@Theo对我来说这很有帮助。我不是以英语为母语的人,我认为“不匹配的列名/值”意味着我的列类型与我的值类型不匹配。如果他们告诉我参数的数量不匹配,我会节省很多时间。好吧,cql3默认不区分大小写,除非你引用所有内容。如果你发布收到的错误消息,这会很有帮助。我投票决定关闭,我认为在你要求别人为你计数之前,你应该表明你已经做了一些最少量的工作来试图理解这个问题。如果计算机告诉你没有足够的值,数一数你的值,看看它们是否相加。@Theo对我来说这很有帮助。我不是以英语为母语的人,我认为“不匹配的列名/值”意味着我的列类型与我的值类型不匹配。如果他们告诉我参数的数量不匹配,我会节省很多时间。尽管我在开发.NET应用程序时遇到了“不匹配的列/值”,并且我是通过字符串连接创建查询的(列/值的数量相同,因此没有明显的不匹配),换成事先准备好的陈述实际上解决了我这方面的问题。谢谢你,西奥!尽管我在开发.NET应用程序时遇到了“不匹配的列/值”,并且我是通过字符串连接创建查询的(列/值的数量相同,因此没有明显的不匹配),但切换到预处理语句实际上解决了我这方面的问题。谢谢你,西奥!