直接从querydsl更新数据时如何刷新Spring JPA?

Posted

技术标签:

【中文标题】直接从querydsl更新数据时如何刷新Spring JPA?【英文标题】:How to refresh Spring JPA when data is updated from querydsl directly? 【发布时间】:2021-11-08 09:35:34 【问题描述】:

我正在使用 spring data jpa 和 querydsl。我不想直接通过 JPA 更新,因为我必须提交一个完整的实体,这会引入不必要的查询。所以,我改用 querydsl:

val qRecord = QCoupon.coupon
jpaQueryFactory.update(qRecord)
    .set(qRecord.useState, Coupon.STATE_ORDERED)
    .set(qRecord.useTime, useTime)
    .where(qRecord.id.eq(recordId))
    .execute()

但是在同一个事务中之后的查询不能得到最新的数据,我认为这与一级缓存有关。

添加@Modifying不起作用,因为我没有使用@Query,第一个注释将被忽略。

我知道EntityManager.clear() 可以解决这个问题。但它看起来太重了,我不确定这是个好主意。

This post 很好地解释了问题的原因,但不是我的情况——我拒绝了这两个答案。

    @Modifying 被忽略。 EntityManager.clear() 看起来太重了,find() 也需要一个实体。

【问题讨论】:

您是否尝试过刷新实体? entityManager.refresh(entityManager.find(Coupon.class, recordId)) 这能回答你的问题吗? Spring data - Refresh entity after "manual" backend query update @Jan-WillemGmeligMeyling 很好,它有效。请将您的想法放在回答区,以便我接受。 @JensSchauder 我已阅读该帖子及其相关帖子。他们很好地解释了问题的原因,但不幸的是,它不适合我的用例。还是谢谢大家。 该问题甚至描述了问题本身中refresh 的用法,您声称它可以解决您的问题。 【参考方案1】:

感谢@Jan-WillemGmeligMeyling 的想法。因为他没有回复我,所以我在回复中写了。

您是否尝试过刷新实体? entityManager.refresh(entityManager.find(Coupon.class, recordId))

em.find() 不会查找整个表格,这就是我想要的。

【讨论】:

以上是关于直接从querydsl更新数据时如何刷新Spring JPA?的主要内容,如果未能解决你的问题,请参考以下文章

从api更新数据时如何自动刷新组件,无需页面刷新

如何使用 Querydsl 更新 JPA 实体?

ios UITableView刷新TableCell问题

如何使用 QueryDSL 在查询中使用 SAMPLE 关键字

小程序刷新页面的方法

在构建期间启用刷新edmx或从数据库更新模型