8

我有一个本机 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

4

1 回答 1

5

每个 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 Entity 复合主键类似乎是一种更好的方法。请参阅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;
    }
    ...
于 2016-04-07T00:17:38.947 回答