Java 执行延迟加载以查看资源是否存在
我正在使用play框架创建一个RESTAPI。我想使用延迟加载(finder.ref(id)或Ebean.getReference(id))来查看数据库中是否存在具有特定id的enity。如果它不存在,我将返回404 如果我尝试使用不存在的id删除,则会引发OptimisticLockException。但这似乎不是判断实体是否存在的有效依据 是否可以使用延迟加载通过id检查实体是否存在?我总是可以做finder.byId(id),这可以得到我想要的。但我想有效地做到这一点Java 执行延迟加载以查看资源是否存在,java,orm,playframework-2.0,entity,ebean,Java,Orm,Playframework 2.0,Entity,Ebean,我正在使用play框架创建一个RESTAPI。我想使用延迟加载(finder.ref(id)或Ebean.getReference(id))来查看数据库中是否存在具有特定id的enity。如果它不存在,我将返回404 如果我尝试使用不存在的id删除,则会引发OptimisticLockException。但这似乎不是判断实体是否存在的有效依据 是否可以使用延迟加载通过id检查实体是否存在?我总是可以做finder.byId(id),这可以得到我想要的。但我想有效地做到这一点 谢谢您可以使用指定的
谢谢您可以使用指定的
id
对项目进行计数,虽然您的id
是唯一的,但如果项目存在,它将返回1,如果不存在,则返回0,因此您可以轻松地设置条件:
boolean itemExists
= (YourModel.find.where().eq("id", id).findRowCount() == 1) ? true : false;
Logger.info("Item " + ((itemExists) ? "exists" : "not found!"));
另一方面,如果您的意图是为Json中的一个示例返回现有实体,则不需要进行单独的检查,只需检查它是否为null
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)
确定对象是否存在,因为它总是不为null,因此IMHO通过id计算元素比选择单个字段来检查Db是否返回实体更便宜
实际上,find.byId(id)
是最昂贵的选项,因为它加载整个实体,对于优化良好的API,通常最好使用Ebean的select()
和fetch()
编写专用方法,例如:
YourModel e = YourModel.find.select("id, name, age").where().eq("id", id).findUnique();
或
List le=YourModel.find.select(“id,name,age”).where().eq(“id”,id).findList();
我想看看是否有一种方法可以通过延迟加载来实现这一点,即获取引用而不是整个对象。也许我正在尝试进行不必要的优化。我甚至不确定调用(find.ref(id)和find.byId(id))的成本是多少。我想第一个选项可以。我用它来删除,所以我不需要json。只想知道该项目已存在且已被删除。
List<YourModel> le = YourModel.find.select("id, name, age").where().eq("id", id).findList();