0

我正在使用播放框架创建一个 REST API。我想使用延迟加载( finder.ref(id) 或 Ebean.getReference(id) )来查看数据库中是否存在具有特定 id 的实体。如果它不存在,我将返回 404。

如果我尝试使用不存在的 id 进行删除,则会引发 OptimisticLockException。但这似乎不是判断实体是否存在的有效依据。

是否可以使用延迟加载通过 id 检查实体是否存在?我总是可以做 finder.byId(id) 这可以得到我想要的。但我想有效地做到这一点。

谢谢

4

1 回答 1

1

您可以只计算指定的项目id,而您的项目id是唯一的,如果项目存在则返回 1,如果不存在则返回 0,因此您可以轻松地创建条件:

boolean itemExists 
        = (YourModel.find.where().eq("id", id).findRowCount() == 1) ? true : false;

Logger.info("Item " + ((itemExists) ? "exists" : "not found!"));

另一方面,如果您的意图是为 Json 中的示例返回现有实体,则无需进行单独检查,只需检查它是否不为空...

YourModel entity = YourModel.find.byId(id);
if (entity == null) return notFound("No such record");

// .. rest of code for preparing API...

编辑

关于成本:find.byId(id)尝试获取整个实体,而find.ref(id)仅获取参考。不幸的是,您无法确定对象是否存在,ref(id)因为它始终不为空,因此恕我直言,按 id 计数元素比选择单个字段来检查 Db 是否返回实体更便宜。

实际上find.byId(id)是最昂贵的选项,因为它加载整个实体,对于优化良好的 API,通常最好使用 Ebean 编写专用方法select()fetch()例如:

YourModel e = YourModel.find.select("id, name, age").where().eq("id", id).findUnique();

或者

List<YourModel> le = YourModel.find.select("id, name, age").where().eq("id", id).findList();
于 2013-06-05T14:09:21.720 回答