原生查询(JPA)未重置并返回相同的旧结果

我有一个本机SQL查询如下:

for(init i=0; i <=2 ; i++){ String sql = "Select * from accounts where id = ?"; Query query = em.createNativeQuery(sql,AccountBean.class); query.setParameter(1, i ); AccountBean accountBean = (AccountBean)query.getSingleResult(); } 

对于第一个循环,它工作正确,但第一个循环后的任何循环返回相同的结果到第一个,我调试它,参数更改,如果我更改它的工作正确

 Query query = em.createNativeQuery(sql,AccountBean.class); 

 Query query = em.createNativeQuery(queryString); 

关心Wish79

每个JPA实体都必须有一个主键。 您的JPA实体可能无法正确反映数据库表上的主键(如果有)。

我遇到了同样的问题。 在我的模型类中,我只有一个用@Id注释的类变量。 但是,这并不是表本身的准确反映,表本身具有复合主键。 因此,我的查询结果返回了正确的行数,但每个行都包含相同的值,即使db中的实际数据不同。 例如,这个查询:

 Query query = entityManager.createQuery ("SELECT tbl FROM Tbl tbl WHERE tbl.id = 100 and tbl.code in ('A','B','C')"); 

…返回10行,每行显示代码 “A”。 但实际上,这10行中有9行具有不同的代码值(’B’或’C’)。 似乎结果被缓存和/或tbl.code谓词被忽略了。 (无论我使用的是JPQL 还是 Native SQL,都会发生这种情况。)非常令人困惑。

为了解决这个问题,我在模型中添加了一个额外的@Id注释来反映复合主键:

 @Id @Column(name = "Code") public String getCode() { return this.code; } 

现在,查询正确返回数据,并且不再有效地忽略代码选择条件。

编辑:虽然以上对我有用,但在进一步研究中,配置单独的JPA实体复合主键类似乎是一种更好的方法。 见http://docs.oracle.com/cd/E16439_01/doc.1013/e13981/cmp30cfg001.htm 。

例如,这是一个带有嵌入式主键的Entity类(请参阅@EmbeddedId):

 /** * The persistent class for the SOME_TABLE database table. */ @Entity @Table(name = "SOME_TABLE") public class SomeTable implements Serializable { @EmbeddedId private SomeTablePk id; @Column(name = "NUMBER_HRS") private BigDecimal numberHrs; ... 

…这里是复合主键类(参见@Embeddable):

 @Embeddable public class SomeTablePk implements Serializable { @Column(name = "SOME_ID") private String someId; @Column(name = "ANOTHER_ID") private BigDecimal anotherId; public String getSomeId() { return someId; } ...