Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JPA标准API中使用Hibernate获取配置文件_Hibernate_Jpa_Criteria Api - Fatal编程技术网

在JPA标准API中使用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配置文件和JPA标准API吗

虽然它是特定于hibernate的,但是因为它是经过配置的 在会话级别,并且知道它的目的是替换hibernate @Fetch(FetchMode.SELECT)的静态配置,我想知道为什么它被忽略在我的例子中,这是hibernate的预期行为吗

下面是我所做的代码快照

@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();
    }