Java 执行延迟加载以查看资源是否存在

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),这可以得到我想要的。但我想有效地做到这一点 谢谢您可以使用指定的

我正在使用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();