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 整个依赖实体.. 只能是普通属性(我假设是这种情况)。