我有一个本机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
答案 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;
}
...