在JPA标准API中使用Hibernate获取配置文件
可以使用fetch配置文件和JPA标准API吗 虽然它是特定于hibernate的,但是因为它是经过配置的 在会话级别,并且知道它的目的是替换hibernate @Fetch(FetchMode.SELECT)的静态配置,我想知道为什么它被忽略在我的例子中,这是hibernate的预期行为吗 下面是我所做的代码快照在JPA标准API中使用Hibernate获取配置文件,hibernate,jpa,criteria-api,Hibernate,Jpa,Criteria Api,可以使用fetch配置文件和JPA标准API吗 虽然它是特定于hibernate的,但是因为它是经过配置的 在会话级别,并且知道它的目的是替换hibernate @Fetch(FetchMode.SELECT)的静态配置,我想知道为什么它被忽略在我的例子中,这是hibernate的预期行为吗 下面是我所做的代码快照 @Fetch(FetchMode.SELECT) @OneToMany(cascade= {CascadeType.MERGE, CascadeType.PERSIST, C
@Fetch(FetchMode.SELECT)
@OneToMany(cascade= {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy="entityB", orphanRemoval= true, fetch= FetchType.LAZY)
private List<EntityA> aList = new ArrayList<>();
@Fetch(FetchMode.SELECT)
@OneToMany(cascade={CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REMOVE},mappedBy=“entityB”,orphanremovation=true,fetch=FetchType.LAZY)
私有列表列表=新的ArrayList();
@Transactional(readOnly=true)
公共列表查找(){
Session Session=entityManager.unwrap(Session.class);
会话.enableFetchProfile(“profile-for-select-A”);
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery CriteriaQuery=builder.createQuery(EntityA.class);
Root=criteriaQuery.from(EntityB.class);
criteriaQuery.distinct(true);
TypedQuery TypedQuery=entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult(0);
typedQuery.setMaxResults(50);
返回typedQuery.getResultList();
}
这样做的目的是使用select查询而不是join来生成惰性集合
如果集合是急切的,并且使用相同的条件查询和静态配置,则惰性集合将通过选择查询而不是联接进行初始化
这是启用配置文件的正确方法吗?或者可以在其他会话中启用,而不是在当前会话中启用
谢谢你的帮助
<fetch-profile name="profile-for-select-A">
<fetch entity="EntityB" association="aList" style="select"/>
</fetch-profile>
@Transactional(readOnly=true)
public List<EntityB> find(){
Session session = entityManager.unwrap(Session.class);
session.enableFetchProfile("profile-for-select-A");
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<EntityB> criteriaQuery = builder.createQuery(EntityA.class);
Root<EntityB> root = criteriaQuery.from(EntityB.class);
criteriaQuery.distinct(true);
TypedQuery<EntityB> typedQuery = entityManager.createQuery(criteriaQuery);
typedQuery.setFirstResult(0);
typedQuery.setMaxResults(50);
return typedQuery.getResultList();
}