Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra 使用PlayOrm读取查询不会返回适当的结果_Cassandra_Playorm - Fatal编程技术网

Cassandra 使用PlayOrm读取查询不会返回适当的结果

Cassandra 使用PlayOrm读取查询不会返回适当的结果,cassandra,playorm,Cassandra,Playorm,我刚刚开始探索PlayOrm,并尝试运行网络上的基本代码来插入和读取数据。当我插入数据时,一切似乎都正常工作,但在读取相同的数据时,它返回的行数不正确。例如,如果我插入3条记录,有时会得到0条记录,有时会返回所有记录 下面是我正在使用的代码: 用于插入/读取数据的类: @NoSqlEntity @NoSqlQueries({ @NoSqlQuery(name="findByLastName", query="PARTITIONS t('lastName',:lastName) s

我刚刚开始探索PlayOrm,并尝试运行网络上的基本代码来插入和读取数据。当我插入数据时,一切似乎都正常工作,但在读取相同的数据时,它返回的行数不正确。例如,如果我插入3条记录,有时会得到0条记录,有时会返回所有记录

下面是我正在使用的代码:

用于插入/读取数据的类:

  @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