使用objectify查询具有嵌入实体的实体列表

时间:2016-05-20 18:51:08

标签: android google-app-engine objectify

我有一个简单的@Entity类,带有标准的@Id Long id和几个字段。其中一个字段是Map。

@Entity
public class MyEntity{

@Id Long id;

@Index String fieldOne;  
@Unindex int fieldTwo;  
@Unindex int fieldThree; 
@Unindex Map<String, MyPojo> map = new HashMap<>();
}

根据我的收集,Objectify将此地图视为嵌入式实体。 当我使用:

查询列表时
List<MyEntity> list = ofy().load().type(MyEntity.class).filter("fieldOne =", fieldList).list();

查询执行正常,但当我尝试对列表执行任何操作时,我得到此异常

  

java.util.ArrayList无法转换为com.google.appengine.api.datastore.EmbeddedEntity

在使用这些方法后触摸查询时也会抛出此异常:

  Map<Long, MyEntity> query = ofy().load().type(MyEntity.class).ids(idsList);

   Map<Key<MyEntity>, MyEntity> query= ofy().load().keys(iterableOfKeys);

现在在一些测试中,我发现如果我将地图更改为

   @Unindex Map<String, Integer> map = new HashMap<>();
一切都很好。所有上述查询都有效,我可以迭代它们,依此类推。所以我的问题是我错过了什么?我是否尝试过这一切?或者是否有更好的方法来解决这个问题?

我使用的是最新版本Objectify 5.1.12。

由于

2 个答案:

答案 0 :(得分:0)

没有得到MyPojo的类定义,我认为它没有定义为@Entity来自Objectify文档:

  

值可以是可以作为字段保留的任何类型,包括基本类型, 嵌入对象 和集合。

假设这是你的MyPojo,它应该是这样的:

  @Entity
  class MyPojo {
      String firstName;
      String lastName;
      Integer age;
  }

它适用于您的更改的原因是因为您使用了基本类型作为地图的值。

答案 1 :(得分:-1)

当我修改现有实体的结构并在更改后查询它时,会遇到同样的问题。