gpt4 book ai didi

Java JPA "Error compiling the query"当它使用枚举时

转载 作者:行者123 更新时间:2023-11-30 05:08:51 26 4
gpt4 key购买 nike

以下 JPA 查询无法编译:

@NamedQuery(name = "PSA.findBySourceSystem", 
query = "SELECT p FROM PSA p WHERE p.sourceSystem.id = :sourceSystemId")

p.sourceSystem 是以下枚举:

public enum SourceSystem {
FIRST(3, "ABC"), SECOND(9, "DEF"), THIRD(17, "GHI");

private int id;
private String code;
...
}

并映射到 PSA 的类:

public class PsaBase implements Serializable {
@Column(name = "sourceSystemId")
@Enumerated(EnumType.ORDINAL)
protected SourceSystem sourceSystem;
...
}

如果我将查询中的 p.sourceSystem.id 替换为更良性的内容,查询将编译并运行良好。

预先感谢您的帮助。

最佳答案

它不应该编译。

您必须先手动解析所需的枚举值,然后再将其作为查询参数传递:

@NamedQuery(name = "PSA.findBySourceSystem",  
query = "SELECT p FROM PSA p WHERE p.sourceSystem = :sourceSystem")

.

public enum SourceSystem { 
...
private static Map<Integer, SourceSystem> valuesById = new HashMap<Integer, SourceSystem>();
static {
for (SourceSystem s: values())
valuesById.put(s.id, s);
}
public static SourceSystem findById(int id) {
return valuesById.get(id);
}
}

.

em.createNamedQuery("PSA.findBySourceSystem")
.setParameter("sourceSystem", SourceSystem.findById(sourceSystemId));

编辑:由于 sourceSystem 被注释为 @Enumerated(EnumType.ORDINAL),它作为相应枚举值的序数存储在数据库中,因此 FIRST 存储为 0。 JPA 不直接支持使用枚举值的任意字段来在数据库中标识它。如果您的数据库架构假设是这样,您可以执行以下技巧来将对象的状态与数据库架构分离:

public class PsaBase implements Serializable { 
protected SourceSystem sourceSystem;

@Column(name = "sourceSystemId")
public Integer getSourceSystemId() {
return sourceSystem.getId();
}

public void setSourceSystemId(Integer id) {
this.sourceSystem = SourceSystem.findById(id);
}
... getter and setter of sourceSystem with @Transient ...
}

关于Java JPA "Error compiling the query"当它使用枚举时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4195613/

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