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

时间:2015-05-28 20:21:30

标签: java jpa jdbc

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

问题是它适用于某些表,但在其他表上它返回正确的行数,但它们都是相同的...它是相同的代码,因为我将工作代码复制到另一个类和只对表名进行了全部更改。我也尝试了由facet创建的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());
    }
}

当相同的代码与另一个表一起工作时,有什么想法为什么我会用一个表获得所有相同的值?

提前致谢。

2 个答案:

答案 0 :(得分:4)

我遇到了同样的问题。

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

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

在DB中,您可以看到:

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注释,并检查该字段值在数据库中是否真的唯一。

答案 1 :(得分:0)

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