弹簧数据jpa中的复杂和快速更新

时间:2017-07-25 06:09:52

标签: java hibernate jpa spring-data-jpa

我有一个名为Product的实体。它有几个字段,用户可以任意更新它的一个或多个字段。为了更新Product,我知道我可以从数据库获取持久产品并更新它并再次save字段,但这会导致实际的性能损失。更好的方法是在ProductRepostory接口中创建自定义更新查询,但在这种情况下,我应该为每个方案编写多个更新函数。我想获得Map<String,Object>更新字段及其值,并编写查询以按比例更新主题。

我听说Hibernate能够创建自定义更新查询并执行下面的代码

@Stateless
@LocalBean
public class OrderManagement {
    @PersistenceContext
    private EntityManager em;

    ...

    public void updateOrder(Double oldAmount, Double newAmount) {
        CriteriaBuilder cb = this.em.getCriteriaBuilder();

        // create update
        CriteriaUpdate<Order> update = cb.
        createCriteriaUpdate(Order.class);

        // set the root class
        Root e = update.from(Order.class);

        // set update and where clause
        update.set("amount", newAmount);
        update.where(cb.greaterThanOrEqualTo(e.get("amount"), oldAmount));

        // perform update
        this.em.createQuery(update).executeUpdate();
    }

} 

但是我想知道如何在spring数据jpa环境中使用它,最大的问题是如何获取entityManager实例,而下一个是哪个是最适合放置此功能的地方? ProductRepostory界面或一些自定义界面,如果答案是自定义界面,如何注册?

1 个答案:

答案 0 :(得分:0)

好的,提出这个问题的主要原因是错误的假设,我认为在程序中获取和更新实体可能会导致性能问题,但正如@JBNizet所提到的,通过id获取实体很快,而且Hibernate处理持久更改实体,无需手动调用save

简而言之,提出保存管理实体的新方法并不有用,而且更好地手动避免更新实体,但如果想要手动扩展Jpa存储库,则{{3}正如评论中提到的那样解释它。