gpt4 book ai didi

jpa - 使用 JPQL createQuery 时返回的旧数据

转载 作者:行者123 更新时间:2023-12-01 11:03:38 25 4
gpt4 key购买 nike

使用 JPA/Eclipse TopLink。

我正在更新一个表(使用 createNativeQuery),如下所示:

Query query = em.createNativeQuery("UPDATE Products SET productName='" + p.getProductName() + "',productVendor='" + p.getProductVendor() + "',productDescription='" + p.getProductDescription() + "',quantityInStock=" + p.getQuantityInStock() + ",buyPrice =" + p.getBuyPrice() + ",msrp=" + p.getMsrp() + " WHERE productCode='" + p.getProductCode() + "'");
query.executeUpdate();

更新反射(reflect)在数据库(MySQL)中

检索(使用 createQuery)如下所示:

Query query1 = em.createQuery("SELECT p from Products p where p.productCode='"+searchTerm+"'");
return query1.getResultList();

但是返回的ResultList始终是更新前的数据。但是当我使用 createNativeQuery 而不是 createQuery 时,会返回最新的更新数据。 createQuery 方法可能会出现什么错误?

最佳答案

当您使用批量更新或 native 查询时,您将绕过一级缓存。 Toplink 无法知道其一级缓存中已有的实体已更改。因此必须清除实体管理器以便查询返回刷新的对象。

但最好的方法可能是首先避免批量更新。您的第一个查询可以替换为 JPQL 查询,该查询使用给定代码加载产品,然后简单地更新 Product 实体。即使您保留更新查询,它也可以用 JPQL 而不是 SQL 编写(但您仍然会遇到您遇到的问题)。

最后,您的查询应该使用参数来避免注入(inject)并确保所有内容都被正确转义:

Query query1 = em.createQuery("SELECT p from Products p where p.productCode = :searchTerm);
query1.setParameter("searchTerm", searchTerm);
return query1.getResultList();

关于jpa - 使用 JPQL createQuery 时返回的旧数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com