您可以使用条件 API 控制 Hibernate 中的抓取行为吗?

Can you control fetching behaviour in Hibernate using the criteria API?

我知道您可以使用 @javax.persistence.FetchType 控制抓取行为,但是 您可以从 JPA 条件查询中以编程方式控制抓取吗? 基本上我可以从查询中看出可能调用应用程序的哪一部分以及(最有可能)需要模型的哪一部分。

我在任何教程中都找不到答案,但这些老问题:


tl;dr: 你能控制从 JPA 条件查询中以编程方式获取吗?

您可以为此使用实体图(它适用于 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;
    }
}

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