如何使用Objectify进行泛型查询,以获得每种类型的样本实体

时间:2013-11-22 20:21:10

标签: java google-app-engine google-cloud-datastore objectify

我的应用程序中有许多不同的种类,它们在数据存储区中是不相关的,但它们共享一个共同的Java基类,这有助于我一般地处理它们。 (一般来说,我的意思是不考虑它们的种类,而不是Java的“泛型”意义。)

现在我想对每种实体进行一些测试,我无法弄清楚如何去做。

我想做这样的事情:

Class<? extends MyBaseUnit> cl = getNextKind();
MyBaseUnit bu = (MyBaseUnit) ofy().load().type( cl ).filter( ?? ).first().now();

我认为没有任何像null过滤器这样的东西,如果我只是删除filter()调用,那么first()返回一个Ref,我似乎无法做多少。

我想我可以对所有具有长ID的类型使用(“id&gt;”,0)的过滤器,但对于具有字符串名称的过滤器,类似的无意义过滤器会是什么?

或许有更好的方法可以做到这一点?我的理想是每次运行测试时检索不同的实体。

1 个答案:

答案 0 :(得分:0)

最后,我在问题的最后部分采用了丑陋的方式:

for (KindInfo ki: kinds) {
    BaseUnit bu = null;
    List<? extends BaseUnit> lbu = null;

    if (ki.usesLongKey()) {
        lbu = ofy().load().type( cl ).filter( "id !=", 7).limit(1).list();
    } else {
        lbu = ofy().load().type( cl ).filter( "kn !=", "barf35" ).limit(1).list();
    }
    if ((null == lbu) || (0 == lbu.size())) {
        Log.i( "No entities for type=" + cl.getName() );
    } else {
        bu = (BaseUnit) lbu.get(0);
        runTestsOnSampleEntity( bu );
    }
}

过滤器只是组成值(“kn”是我使用字符串键名的所有种类使用的属性名称。)

我最初尝试使用(“id!=”,0“)的过滤器,因为0不是有效的id,但是这导致了”“java.lang.IllegalArgumentException”。