检查 JPA 实体是否存在而不加载它

Check if JPA entity exists without loading it

问题如下

我们有一个服务器端点,它接收来自客户端的反馈。以 multipart/form-based 格式收到的反馈,字段:

ProductId - product identifier
Message - feedback message
Log_file - attached log file
Screenshot - attached screenshot file

服务器代码首先检查具有给定 ID 的产品是否存在,如果不存在 - 关闭连接而不接收任何附加文件。

我们使用 Eclipselink JPA 来存储产品对象。

如何在不从基础数据库加载的情况下检查具有给定 ID 的产品是否存在?

您可以使用 count 查看是否会返回具有该 ID 的任何行。

em.createQuery(
    "SELECT COUNT(b.productId) 
    FROM Products b WHERE b.productId=:productId"
);

如果 count < 1 没有具有该 ID 的产品。 否则有具有该 ID 的产品。

你到底想避免什么? JPA 允许延迟加载实体中的几乎每个字段,因此您返回的内容可能会加载也可能不会加载。一个简单的 EntityManager.find 操作将从缓存中检索实体(如果存在),如果不存在,则检查数据库,因此对于大多数情况而言,这可能就足够了。如果它转到数据库,它将构建一个实例并将其放入缓存中,但该实例将仅包含预热映射。

否则,您可以避免使用任何 returns 数据而不是实体实例的 JPA 查询进行加载,但这将需要命中数据库。上面的计数选项是一种方法,但简单的 "Select e.id from Employee e where e.id =:empId" 也可以。