JPQL Update Query在不使用主键的情况下更新实体

时间:2014-05-01 00:57:00

标签: java jpa jpql

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

说我有和实体如下:

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

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

这样的东西
UPDATE Customer c SET c = :customer WHERE c.uniqueExternalId = :externalId

在JQPL中是否可以这样?

1 个答案:

答案 0 :(得分:3)

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

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节中建议:

  

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