我有使用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());
}
}
当相同的代码与另一个表一起工作时,有什么想法为什么我会用一个表获得所有相同的值?
提前致谢。
答案 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 值创建了一个主缓存。