直接从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?的主要内容,如果未能解决你的问题,请参考以下文章