Java 使用 JPA 2.1 和 @ManyToOne 上的 hibernate 部分加载实体

标签 java hibernate jpa many-to-one

我有一个实体,里面有很多属性和关系。在某些情况下,我只需要 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 被忽略了?

最佳答案

即使您定义了提示,它仍然是一个可选的东西。

我建议在选择中以结果类的形式作为投影(如果您不打算随后更新实体,则建议选择该选项):

@NamedQueries({
    @NamedQuery(name = EECase.QUERY_ALLCASES
    , query = "SELECT new com.domain.EECase(c.caseNumber, c.firstName, c.lastName) 
               FROM EECase c")
})

请记住放置一个适当的构造函数来按给定顺序接受投影的列。

您还可以使用单独的 POJO 来映射该查询的结果。不一定是实体类本身。

另请记住,您将无法选择整个依赖实体..只能选择普通属性(我假设是这种情况)。

关于Java 使用 JPA 2.1 和 @ManyToOne 上的 hibernate 部分加载实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44674317/

相关文章:

java - 在 Maven 中找不到 hibernate-spatial 4.3

java - 在 Hibernate 中映射枚举子类型

jpa - Hibernate Envers 无法删除实体

java - 为什么 Hibernate 会阻止 Java 进程退出?

java - apache commons 日志记录是否支持占位符?

java - 使用 Java Streams 对 concat 字符串执行算术运算

Java JTree - setSeelectionPath

java - 在java中使用超出范围的变量

hibernate - 非键列的@OneToOne 映射

java - Hibernate OneToMany 完整性约束冲突 : foreign key no parent