JPA获取重复的行(结果都具有相同的值)

Jay*_*oon 6 java jpa jdbc

我有JDBC的经验,正在尝试迁移到JPA。我使用从Netezza DB读取的Eclipse方面创建了一些实体类。我正在使用带有TypedQuery返回的createNativeQuery。我正在做一个简单的选择*从表。

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

这是调用Entity类的代码:

@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());
    }
}
Run Code Online (Sandbox Code Playgroud)

关于为什么当同一代码与另一张表一起工作时为什么要在一张表中获得所有相同值的想法?

提前致谢。

Gáb*_*kós 6

我遇到了同样的问题。

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

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

在数据库中,您可以看到:

1; ID:111,名字:AAA

2; ID:111,名字:BBB

3; ID:111,名字:CCC

结果将是JPA检索的3行:

1; 第111章总统千金vs商界巨子

1; 第111章总统千金vs商界巨子

1; 第111章总统千金vs商界巨子

检查Entity是否具有@Id批注,并检查该字段值在DB中是否真正唯一。