JQPL更新查询以在不使用主键的情况下更新实体

这可能是一个简单的问题,但我试图找出是否有一种方法可以创建一个JPQL更新查询,允许我使用不是主键的唯一列标识符更新单个持久实体。

说我有和实体如下:

@Entity public class Customer { @ID private Long id; @Column private String uniqueExternalID; @Column private String firstname; .... } 

使用设置了id值的Customer更新此实体很容易,但是,我想使用uniqueExternalId更新此客户实体,而无需预先查询本地实体并合并更改或手动构建jpql查询手动中的字段。

就像是

 UPDATE Customer c SET c = :customer WHERE c.uniqueExternalId = :externalId 

在JQPL中这样的事情可能吗?

您不能以您描述的确切方式执行此操作 – 通过传递实体引用,但您可以使用批量查询来实现相同的效果。

 UPDATE Customer c SET c.name = :name WHERE c.uniqueExternalId = :externalId 

请注意,您必须明确定义每个更新的属性。

值得注意的是,批量查询会绕过持久性上下文。 在持久性上下文中管理的实体实例不会反映批量更新所更改的记录的更改。 此外,如果使用乐观锁定,请考虑使用批量更新来增加实体的@Version字段:

  UPDATE Customer c SET c.name = :name, c.version = c.version + 1 WHERE c.uniqueExternalId = :externalId 

编辑:JPA 2.0规范建议在第4.10节:

通常,批量更新和删除操作应仅在新持久性上下文中的事务内执行,或者在获取或访问其状态可能受此类操作影响的实体之前执行。