【问题标题】:JPA getting repeated rows (results all have the same values)JPA 获得重复的行(结果都具有相同的值)
【发布时间】:2015-08-11 12:59:11
【问题描述】:

我有使用 JDBC 的经验,并且正在尝试转向 JPA。我使用从 Netezza DB 读取的 eclipse facet 创建了一些实体类。我正在使用带有 TypedQuery 返回的 createNativeQuery。我正在做一个简单的 select * from table。

问题是它对某些表很有效,但在其他表上它返回正确的行数,但它们都是相同的......这是相同的代码,因为我将工作代码复制到另一个类并且只对表名进行了全部更改。我还尝试了由 facet 创建的 namedQuery,它给出了相同的结果。

这是调用实体类的代码:

@Test
public void test2() {
    assertTrue(emf != null);
    if (em == null) {
        em = (EntityManager) Persistence.
                  createEntityManagerFactory("web20POC").
                  createEntityManager();
    }
    TypedQuery<Dimtask> tq = (TypedQuery<Dimtask>) em.createNamedQuery("Dimtask.findAll", Dimtask.class);
    tq.setFirstResult(0);
    tq.setMaxResults(10);
    List<Dimtask> rlist = tq.getResultList();
    for (Dimtask line : rlist) {
        System.out.println(line.toString().trim());
    }
}

知道为什么当相同的代码适用于另一个表时,我会在一个表中获得所有相同的值吗?

提前致谢。

【问题讨论】:

  • 忘了提到我访问同一个表的 JDBC 代码工作正常并返回唯一值。那么,怀疑 JPA 设置可能存在问题?
  • 请发布有问题的实体。
  • 发布您对名为“Dimtask.findAll”的命名查询的定义。您也可以使用编辑按钮编辑您的原始问题。
  • 嗯,这很尴尬...我无法再重现该问题并获得独特的价值。很抱歉打扰了大家!

标签: java jpa jdbc


【解决方案1】:

我也遇到了同样的问题。

答案是,如果您的实体中有 @Id 注释,JPA 将威胁那些具有给定 id 的行作为唯一元素。

例如,如果您的数据库中有 3 行此 @Id 注释字段相同,则 JPA 将使用第一个结果元素并复制它们。

在数据库中你可以看到:

1; ID:111,姓名:AAA

2; ID:111,姓名:BBB

3; ID:111,姓名:CCC

JPA 检索到的结果将是 3 行:

1; ID:111 名称:AAA

1; ID:111 名称:AAA

1; ID:111 名称:AAA

检查实体是否有@Id 注释,并检查该字段值在数据库中是否真的唯一。

【讨论】:

    【解决方案2】:

    问题在于 ID。 @Id 在数据库中不应具有相同的值,因为为相同的 ID 值创建了主缓存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2016-11-29
      相关资源
      最近更新 更多