【问题标题】:Advice in modeling Datastore Entities with Objectify使用 Objectify 对数据存储实体建模的建议
【发布时间】:2013-09-28 08:47:36
【问题描述】:

我刚开始使用 Datastore 和 Objectify(完全是新手),我正在为我的实体建模之前寻求一些建议。

我正在开发某种股票交易应用程序,用户可以通过定义股票 ID、目标价格和条件(低于或高于目标价格)来跟踪股票。

应用程序从外部网站获取股票并将它们保存在一个数组中。然后它需要检查哪些 StockTracking 与数组中保存的那些股票价格相匹配。

StockTracking 具有以下结构: StockCode、TargetPrice、Condition(更低或更高)

我想做的是这样的:

for (Stock in stockArray) {
  SELECT * FROM StockTracking WHERE StockCode = stock.code AND 
  ((Condition = 'Lower' AND TargetPrice <= Stock.price) OR 
   (Condition = 'Higher' AND TargetPrice >= Stock.price))
}

我需要一些帮助来确定应该如何以及创建哪些索引才能进行这样的查询。此外,虽然股票的数量是固定的并且不是那么大(低于 50 只),但我想知道是否有办法以更优化的方式(即更短的查询时间)来执行此功能。

提前致谢

【问题讨论】:

  • 澄清一下,如果执行“JOIN”比这种方法更有效,我愿意将 Stock 存储在数据存储区中
  • Objectify 有各种注释,例如 @Index,您可以使用这些注释来索引特定字段。明智地使用索引,因为这将对数据存储区进行更多的读写操作。 Objectify 库中还有 Query 类,可以帮助您过滤此类字段。
  • 谢谢@AnkurJain 对于绝对初学者有什么好的教程吗?我对官方文档很迷茫。
  • 请查看我下面的答案,它几乎包含了 objectify 中的所有基本查询。

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


【解决方案1】:

下面是我的一个工作中的一个通用 DAO 类,我在 Objectify 中实现了几乎所有的基本查询。它实际上是使用模板类对基本 Objectify 功能的通用实现。

package com.myweb.common.dao;

import static com.googlecode.objectify.ObjectifyService.ofy;

import java.util.List;

import com.googlecode.objectify.Key;
import com.googlecode.objectify.ObjectifyService;
import com.myweb.common.exception.DatabaseException;
import com.myweb.model.User;

public abstract class AbstractGenericDaoImpl implements GenericDao{

static {
    ObjectifyService.register(User.class);
}

@Override
public <T> void create(T t) {
    ofy().save().entity(t).now();
}

@Override
public <T> String createWithKey(T t) {
    Key<T> key =  ofy().save().entity(t).now();
    return key.getString();
}

@Override
public <T> Long createWithID(T t) {
    Key<T> key =  ofy().save().entity(t).now();
    return key.getId();
}

@Override
public <T> void update(Class<T> clazz, Long id, T t) throws DatabaseException {
    if (id == null) {
        throw new DatabaseException("ID cannot be null");
    }
    T tnew = ofy().load().type(clazz).id(id).get();
    ofy().save().entity(tnew).now();
}

@Override
public <T> void update(Class<T> clazz, String key, T t) throws DatabaseException {
    if (key == null) {
        throw new DatabaseException("ID cannot be null");
    }
    T tnew = ofy().load().type(clazz).id(key).get();
    ofy().save().entity(tnew).now();

}

@Override
public <T> T getById(Class<T> clazz, Long id) throws DatabaseException {
    if (id == null) {
        throw new DatabaseException("ID cannot be null");
    }
    return ofy().load().type(clazz).id(id).get();
}

@Override
public <T> T getByKey(Class<T> clazz, String key) throws DatabaseException {
    if (key == null) {
        throw new DatabaseException("ID cannot be null");
    }
    return ofy().load().type(clazz).id(key).get();
}

@Override
public <T> List<T> list(Class<T> clazz) {
    List<T> list = ofy().load().type(clazz).list();
    return list;
}

@Override
public <T> void delete(Class<T> clazz, Long id) throws DatabaseException {
    if (id == null) {
        throw new DatabaseException("ID cannot be null");
    }
    T t = ofy().load().type(clazz).id(id).get();
    if(t != null){
        ofy().delete().entity(t).now();
    }
}

@Override
public <T> void deleteByKey(Class<T> clazz, String key) throws DatabaseException {
    if (key == null) {
        throw new DatabaseException("ID cannot be null");
    }
    T t = ofy().load().type(clazz).id(key).get();
    if(t != null){
        ofy().delete().entity(t).now();
    }
}
 }

以下是Objectify中使用过滤查询示例的方法。

public User getUserByEmail(String email) {
    return ofy().load().type(User.class).filter("email", email).first().get();
}

使用过滤器列出字段

public List<User> getUsers(String f1, String f2) {
    return ofy().load().type(User.class).filter("f1", f1).filter("f2", f2).list();
}

【讨论】:

  • 谢谢,这确实很有帮助!只是一个问题,是否可以通过键以外的其他属性加载实体过滤?我在做 ofy().load().type(StockTracking.class).filter("deviceId =", deviceId).filter("stockCode =", stockCode) 但这会返回一个 Query 对象,我不知道如何让 LoadResults 调用 run()
  • 您可以查询任意数量的过滤器。完成过滤器后,在末尾添加一个 list()
  • @momo 请检查我的更新答案,它将回答您的问题
  • 非常感谢!他们应该在文档中包含一个像这样的简单示例;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2023-03-27
  • 2012-03-03
  • 1970-01-01
  • 2021-01-10
相关资源
最近更新 更多