gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:29:52 24 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

你可以只计算指定id的item,而你的id是唯一的,如果item存在则返回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();

关于java - Ebean延迟加载查看资源是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936563/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com