你能用标准API控制Hibernate中的抓取行为吗?

时间:2015-12-07 15:37:16

标签: java hibernate jpa criteria-api

我知道您可以使用@javax.persistence.FetchType来控制抓取行为,但是是否可以在JPA Criteria查询中以编程方式控制抓取?基本上我可以从查询中判断应用程序的哪个部分可能会打电话,模型的哪一部分(最有可能)需要。

我无法在任何教程中找到答案,但这些旧问题:

tl; dr:可以在JPA条件查询中以编程方式控制提取吗?

1 个答案:

答案 0 :(得分:2)

您可以使用实体图(适用于JPQL和Criteria API)。

示例:

@Entity
@NamedEntityGraph(name = "User.withRoles", attributeNodes = {
    @NamedAttributeNode("roles") // fetch "roles" eager
})
@NamedQuery(name = "User.byName", query = "SELECT u FROM User u WHERE u.name = :name")
public class User {
    /* ... */

    @Column(updatable = false)
    private String name;

    @ManyToMany // fetch lazy by default
    @JoinTable(name = "user_role", /* ... */)
    private Set<Role> roles;
}

public User getUser(String name, boolean withRoles) {
    TypedQuery<User> query = entityManager.createNamedQuery("User.byName", User.class);
    if (withRoles) {
        EntityGraph<User> loadGraph = (EntityGraph<User>) entityManager.createEntityGraph("User.withRoles");
        query.setHint("javax.persistence.loadgraph", loadGraph);
    }

    try {
        return query.setParameter("name", name).getSingleResult();
    } catch (NoResultException ex) {
        return null;
    }
}

同样,您也可以使用获取图来排除提取字段。