我知道您可以使用@javax.persistence.FetchType来控制抓取行为,但是是否可以在JPA Criteria查询中以编程方式控制抓取?基本上我可以从查询中判断应用程序的哪个部分可能会打电话,模型的哪一部分(最有可能)需要。
我无法在任何教程中找到答案,但这些旧问题:
tl; dr:可以在JPA条件查询中以编程方式控制提取吗?
答案 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;
}
}
同样,您也可以使用获取图来排除提取字段。