gpt4 book ai didi

java - native 查询 (JPA) 未重置并返回相同的旧结果

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:53 24 4
gpt4 key购买 nike

我有一个原生的 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); 

问候愿望79

最佳答案

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

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

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 注释来反射(reflect)复合主键:

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

现在查询正确返回数据,code 选择条件不再被有效忽略。

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

例如,这是一个带有嵌入式主键的实体类(请参阅@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;
}
...

关于java - native 查询 (JPA) 未重置并返回相同的旧结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18506501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com