Native Query(JPA)未重置并返回相同的旧结果

时间:2013-08-29 09:01:57

标签: java hibernate 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

1 个答案:

答案 0 :(得分:2)

每个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行,每行显示&#39; A&#39;的代码。但实际上,这10行中有9行具有不同的代码值(&#39; B&#39;或&#39; C&#39;)。似乎结果被缓存和/或 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;
    }
    ...