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

时间:2015-03-15 18:24:57

标签: java jpa persistence eclipselink

问题在于。

我们有一个服务器端点,可以从客户端收到反馈。以多部分/基于表单的格式收到的反馈,包括字段:

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

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

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

如果没有从底层数据库加载产品,如何检查具有给定ID的产品是否可行?

2 个答案:

答案 0 :(得分:5)

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

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

如果count < 1没有带有该ID的产品。 否则,有一个带有该ID的产品。

答案 1 :(得分:3)

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

否则,您可以使用任何返回数据而不是实体实例的JPA查询来避免加载,但这需要数据库命中。上面的计数选项是单向的,但是一个简单的“从员工e中选择e.id,其中e.id =:empId”也可以。