每个 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;
}
...