Java 使用 JPA 2.1 部分加载实体并在 @ManyToOne 上休眠
Java loading entities partially with JPA 2.1 and hibernate on @ManyToOne
我有一个实体,里面有很多属性和关系。在少数情况下,我只需要 2 个简单的属性,而不是其余的。我尝试使用实体图,但我总是得到完整的条目,包括所有属性、关系...
我的 EECase 实体中的实体图:
@NamedQueries({
@NamedQuery(name = EECase.QUERY_ALLCASES, query = "SELECT DISTINCT c FROM EECase c")
})
@NamedEntityGraph(name = "Case.forDropdown", attributeNodes = {
@NamedAttributeNode("caseNumber"),
@NamedAttributeNode("firstNames"),
@NamedAttributeNode("lastName")
})
在我的 bean 中,我尝试通过以下方式获取过滤的案例:
public List<EECase> getCasesForDropdown() {
TypedQuery<EECase> query = getManager().createNamedQuery(EECase.QUERY_ALLCASES, EECase.class);
EntityGraph<EECase> graph = (EntityGraph<EECase>) getManager().getEntityGraph("Case.forDropdown");
query.setHint("javax.persistence.fetchgraph", graph);
List<EECase> queryEntity = (List<EECase>) query.getResultList();
return queryEntity;
}
setHint 似乎被忽略了?
即使你定义了一个提示,它仍然是一个可选的东西。
我建议在 select 中以结果 class 的形式提出一个小的替代方案(如果您不打算之后更新实体,建议选择):
@NamedQueries({
@NamedQuery(name = EECase.QUERY_ALLCASES
, query = "SELECT new com.domain.EECase(c.caseNumber, c.firstName, c.lastName)
FROM EECase c")
})
请记住放置一个适当的构造函数以按给定顺序接受投影列。
您还可以使用单独的 POJO 来映射该查询的结果。不一定是实体 class 本身。
另外请记住,您将无法 select 整个依赖实体.. 只能是普通属性(我假设是这种情况)。
我有一个实体,里面有很多属性和关系。在少数情况下,我只需要 2 个简单的属性,而不是其余的。我尝试使用实体图,但我总是得到完整的条目,包括所有属性、关系...
我的 EECase 实体中的实体图:
@NamedQueries({
@NamedQuery(name = EECase.QUERY_ALLCASES, query = "SELECT DISTINCT c FROM EECase c")
})
@NamedEntityGraph(name = "Case.forDropdown", attributeNodes = {
@NamedAttributeNode("caseNumber"),
@NamedAttributeNode("firstNames"),
@NamedAttributeNode("lastName")
})
在我的 bean 中,我尝试通过以下方式获取过滤的案例:
public List<EECase> getCasesForDropdown() {
TypedQuery<EECase> query = getManager().createNamedQuery(EECase.QUERY_ALLCASES, EECase.class);
EntityGraph<EECase> graph = (EntityGraph<EECase>) getManager().getEntityGraph("Case.forDropdown");
query.setHint("javax.persistence.fetchgraph", graph);
List<EECase> queryEntity = (List<EECase>) query.getResultList();
return queryEntity;
}
setHint 似乎被忽略了?
即使你定义了一个提示,它仍然是一个可选的东西。
我建议在 select 中以结果 class 的形式提出一个小的替代方案(如果您不打算之后更新实体,建议选择):
@NamedQueries({
@NamedQuery(name = EECase.QUERY_ALLCASES
, query = "SELECT new com.domain.EECase(c.caseNumber, c.firstName, c.lastName)
FROM EECase c")
})
请记住放置一个适当的构造函数以按给定顺序接受投影列。
您还可以使用单独的 POJO 来映射该查询的结果。不一定是实体 class 本身。
另外请记住,您将无法 select 整个依赖实体.. 只能是普通属性(我假设是这种情况)。