客观化复合过滤器实现或破解
objectify composite filter implementation or hack
Objectify 似乎不支持 Datastore 的 CompositeFilter
。但是 objectify 确实需要 Filter
s。那么现在如何在 objectify 中实现复合 AND
过滤器?我要从 Datanucleus 搬过来,我需要查询
"SELECT f.healthy FROM Food f WHERE f.fan = :userid AND flavor = : flavor";
所以类型是Food.class
,字段是fan
和flavor
查询很简单:
List<Food> foods = ofy().load().type(Food.class).filter("fan", xxx).filter("flavor", xxx).list();
确保您计划filter/sort的所有字段在持久化实体之前都标有@Index。
您应该创建一个复合过滤器并将其传递给接受过滤器的 ofy 查询变体。
CompositeFilterOperator.and(
FilterOperator.EQUAL.of("f.fan", userId),
CompositeFilterOperator.or(
FilterOperator.EQUAL.of("flavor", flavor),
FilterOperator.EQUAL.of("color", color)));
但是,实施 OR 过滤器有其自身的副作用;例如你不能使用游标。
Objectify 似乎不支持 Datastore 的 CompositeFilter
。但是 objectify 确实需要 Filter
s。那么现在如何在 objectify 中实现复合 AND
过滤器?我要从 Datanucleus 搬过来,我需要查询
"SELECT f.healthy FROM Food f WHERE f.fan = :userid AND flavor = : flavor";
所以类型是Food.class
,字段是fan
和flavor
查询很简单:
List<Food> foods = ofy().load().type(Food.class).filter("fan", xxx).filter("flavor", xxx).list();
确保您计划filter/sort的所有字段在持久化实体之前都标有@Index。
您应该创建一个复合过滤器并将其传递给接受过滤器的 ofy 查询变体。
CompositeFilterOperator.and(
FilterOperator.EQUAL.of("f.fan", userId),
CompositeFilterOperator.or(
FilterOperator.EQUAL.of("flavor", flavor),
FilterOperator.EQUAL.of("color", color)));
但是,实施 OR 过滤器有其自身的副作用;例如你不能使用游标。