繁体   English   中英

使用JPQL createQuery时返回旧数据

[英]Old data returned when using JPQL createQuery

使用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();

更新反映在DB(MySQL)中

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM