【问题标题】:JPA cache ingnore new parameters in NamedQueryJPA 缓存忽略命名查询中的新参数
【发布时间】:2022-10-06 15:45:38
【问题描述】:

我不是 JPA 专家。有时我必须修复旧代码中的错误:(

现在我有一个像

CREATE TABLE `station_zip` (
  `ID` bigint(20),
  `CREATED_AT` datetime,
  `CREATED_AT_XML` datetime,
  `MODIFIED_AT` datetime DEFAULT NULL,
  `UPD_VERSION` bigint(20) DEFAULT NULL,
  `ZIP_CODE` int(11) DEFAULT NULL,
  `STATION_ID` int(11) DEFAULT NULL,
   primary key (id)
)

JPA代码中的实体定义是:

@Cache(expiry = 300000, size = 10000) // 5 分钟

@Table(name = \"station_zip\")
@NamedQueries({
        @NamedQuery(
                name = StationZipBE.FIND_BY_ZIP_CODE,
                query = \"select z from StationZipBE z where z.zipCode = :zipCode\")
})
public class StationZipBE {
...
}

访问代码是:

try {
            final Query namedQuery = getEntityManager().createNamedQuery(StationZipBE.FIND_BY_ZIP_CODE);
            namedQuery.setParameter(\"zipCode\", zipCode);
            return (StationZipBE) namedQuery.getSingleResult();
        } 
catch (NoResultException e) {
...
}

问题是:

我开始查询第一个 ZIP 并获取正确的站 ID。

我开始查询另一个 ZIP(通过使用 setParameter),但没有得到正确的站 ID。我从第一个 ZIP 中获得了 ID。奇怪的!如果我设置缓存过期 = 1 查询工作是否正确?

这是一个缓存问题,我该如何解决?

    标签: mysql jpa


    【解决方案1】:

    问题不是代码中的错误。我在 DB 中的数据具有列 ID。 JPA 使用此 ID 来引用行。但这就是问题所在。所有行的值 ID=0!所以无法引用。用唯一编号更新 ID 后,我的 JPA 问题就解决了。

    我认为最好对 ID 列使用自动增量,例如:

      `ID` bigint(20) auto_increment,
    

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 2017-08-23
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      相关资源
      最近更新 更多