Ebean延迟加载以查看资源是否存在

时间:2013-06-05 09:42:11

标签: java orm playframework-2.0 entity ebean

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

如果我尝试使用不存在的id进行删除,则抛出OptimisticLockException。但这似乎不是查看实体是否存在的有效依据。

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

谢谢

1 个答案:

答案 0 :(得分:1)

您只需计算指定id的项目,而id是唯一的,如果项目存在则返回1,如果项目不存在则返回0,这样您就可以轻松制定条件:< / p>

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();