Cassandra 使用PlayOrm读取查询不会返回适当的结果
我刚刚开始探索PlayOrm,并尝试运行网络上的基本代码来插入和读取数据。当我插入数据时,一切似乎都正常工作,但在读取相同的数据时,它返回的行数不正确。例如,如果我插入3条记录,有时会得到0条记录,有时会返回所有记录 下面是我正在使用的代码: 用于插入/读取数据的类:Cassandra 使用PlayOrm读取查询不会返回适当的结果,cassandra,playorm,Cassandra,Playorm,我刚刚开始探索PlayOrm,并尝试运行网络上的基本代码来插入和读取数据。当我插入数据时,一切似乎都正常工作,但在读取相同的数据时,它返回的行数不正确。例如,如果我插入3条记录,有时会得到0条记录,有时会返回所有记录 下面是我正在使用的代码: 用于插入/读取数据的类: @NoSqlEntity @NoSqlQueries({ @NoSqlQuery(name="findByLastName", query="PARTITIONS t('lastName',:lastName) s
@NoSqlEntity
@NoSqlQueries({
@NoSqlQuery(name="findByLastName", query="PARTITIONS t('lastName',:lastName) select * FROM TABLE as t"),
@NoSqlQuery(name="findByName", query="PARTITIONS e('name',:name) select * FROM TABLE as e")
})
public class User {
@NoSqlId
private String id;
@NoSqlPartitionByThisField
private String name;
@NoSqlIndexed
private int age;
@NoSqlPartitionByThisField
@NoSqlIndexed
private String lastName;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
/*
* Queries:
* @NoSqlQuery(name="findByLastName", query="PARTITIONS t('lastName',:lastName) select * FROM TABLE as t"),
* @NoSqlQuery(name="findByName", query="PARTITIONS e('name',:name) select * FROM TABLE as e")
*/
public static List<User> findByLastName(NoSqlEntityManager mgr, String lastName) {
Query<User> query = mgr.createNamedQuery(User.class, "findByLastName");
System.out.println("Using last name "+lastName);
query.setParameter("lastName", lastName);
return query.getResultList(0, 100);
}
public static List<User> findByName(NoSqlEntityManager mgr, String name) {
Query<User> query = mgr.createNamedQuery(User.class, "findByName");
System.out.println("Using name "+name);
query.setParameter("name", name);
return query.getResultList(0, 100);
}
}
编辑:这是PlayOrM中一个非常特殊的bug。提交的修复程序是最新版本 只有在同一列上同时使用@nosqlpartitionedby和@NoSqlIndexed两次时,才会发生这种情况。一种解决方法是在where子句(anything)中放入一些内容,每次它都会使用特定的索引(基于where子句中的列)。或者只是获取最新的代码和修复程序 我不确定您是否应该使用分区。在您的示例中,您以两种方式对表进行分区……name和lastName。在一种情况下,具有相同名称的所有行都位于同一分区中。在另一种情况下,具有相同姓氏的所有行都位于同一分区中。您只能查询单个分区。假设你有名字
dean
mike
joe
这是3个不同的分区,您可以查询到任何人。您可以查询“给我分区中lastname=smith=dean的所有人”,或者您可以查询给我分区中lastname=smith=mike的所有人”
想象一下你也有姓
smith
black
obama
您在这里有3个分区,您可以查询“给我分区中名为dean=smith的所有人”或“给我分区中名为dean=black的所有人”
如果您想让事情变得更简单,请去掉所有@NoSqlPartitionByField,这样您就根本不需要分区了
基本上,通过分区,您可以查询单个分区。每个分区都是它自己的索引。这就是为什么它可以扩展为X百万行的无限分区。但是,分区中不能有无限行
我猜很多,因为您的示例只插入一行,而您声称要插入3行,我希望您的代码在这两种情况下都返回1行。您的查询要求返回lastName=“Frieda”所在分区的所有行,然后返回name=“John”所在分区的所有行“由于您存储了一个同时包含这两个对象的对象,这就是行应该位于的分区……这在生产中已经对我们起作用了,我们对此没有任何问题
让我知道,如果你有更多的信息,如代码,做了3次插入,而不仅仅是这一次
Dean我在这些字段上创建了分区,因为我希望这些字段上的查询执行得非常快。仅仅在这些领域建立一个索引是否有助于我们实现同样的目标?(考虑到相同姓氏的不同姓氏数量为50k,相同姓氏的不同可能姓氏数量约为20k)同样在上述代码中,我又插入了两条姓氏相同的记录Jim和Jam Freida。因此,我希望有3条记录响应上一个名称的查询,告诉我不工作的代码,我们可以剪切、粘贴并运行它(本例中使用的是内存版本还是cassandra…,它们工作原理相同,但只是想知道以防万一)。用不起作用的代码编辑帖子。还有,相同姓氏的5万美元……这不是我想要的信息,我不想让你做决定。所需信息为总行数;)。如果没有分区,您就可以进入数百万。限额可能是300万(我以前一直是100万)。我已经编辑了上面的代码。我正在运行完全相同的代码。如果对你有用,试试看。另外,对于行数信息,我想如果我们按lastname划分,因为我们有50K个不同的姓氏,我们将有50K行,名称也是如此。我使用分区逻辑来计算行数可能是错误的。如果您想知道数据库中会存在多少不同的用户记录(User.id字段中具有不同值的用户),那么它将是50k*20k=10亿。如果我错了,让我知道,在记忆中还是在卡桑德拉?我会让vikas看看这个确切的例子。让我确认您希望findByLast返回5个结果,并且您希望findByName返回1个结果,对吗?(这就是我所期望的)。另外,您的示例没有其他姓氏,因此在查看姓氏分区时,只有一个分区。对于firstname分区,共有5个分区,其中都有一行。这就是你所期望的,对吗?没错!这就是我所期待的。我也尝试过没有分区的东西。我看不出有什么问题。一切正常。
dean
mike
joe
smith
black
obama