我正在使用play框架创建REST API。我想使用延迟加载(finder.ref(id)或Ebean.getReference(id))来查看数据库中是否存在具有特定id的enity。如果它不存在,我将返回404。
如果我尝试使用不存在的id进行删除,则抛出OptimisticLockException。但这似乎不是查看实体是否存在的有效依据。
是否可以使用延迟加载来检查id是否存在实体?我总是可以做finder.byId(id),这可以得到我想要的东西。但我想有效地做到这一点。
谢谢
答案 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();