您可以使用条件 API 控制 Hibernate 中的抓取行为吗?
Can you control fetching behaviour in Hibernate using the criteria API?
我知道您可以使用 @javax.persistence.FetchType 控制抓取行为,但是 您可以从 JPA 条件查询中以编程方式控制抓取吗? 基本上我可以从查询中看出可能调用应用程序的哪一部分以及(最有可能)需要模型的哪一部分。
我在任何教程中都找不到答案,但这些老问题:
- NHibernate manually control fetching 这是关于 NHibernate 的,没有答案
- How do you programmatically turn off eager fetching with hibernate? which doesn't mention the criteria API, and is so ancient as not to make this question an automatic duplicate, however I suspect the answer可能还是现在的情况
- JPA & Criteria API - Select only specific columns 这是关于返回元组而不是模型本身
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;
}
}
同样,您也可以使用提取图来排除字段被提取。
我知道您可以使用 @javax.persistence.FetchType 控制抓取行为,但是 您可以从 JPA 条件查询中以编程方式控制抓取吗? 基本上我可以从查询中看出可能调用应用程序的哪一部分以及(最有可能)需要模型的哪一部分。
我在任何教程中都找不到答案,但这些老问题:
- NHibernate manually control fetching 这是关于 NHibernate 的,没有答案
- How do you programmatically turn off eager fetching with hibernate? which doesn't mention the criteria API, and is so ancient as not to make this question an automatic duplicate, however I suspect the answer可能还是现在的情况
- JPA & Criteria API - Select only specific columns 这是关于返回元组而不是模型本身
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;
}
}
同样,您也可以使用提取图来排除字段被提取。