1

我不能让 @FetchProfile 与 HQL 一起工作。

我成功地将它与(旧)本机 Criteria 和 session.get() API 一起使用,但没有与 HQL 一起使用。

正常吗?

感谢我的映射和 FetchProfile 定义

    @FetchProfiles({ @FetchProfile( name = "countryCities", 
            fetchOverrides = { @FetchOverride(entity = Country.class, 
                      association = "cities", mode = FetchMode.JOIN) }) })
    public class Country implements java.io.Serializable {

        @Id
        private long id;
        @Version
        private int version;
        private String country;
        @OneToMany(mappedBy = "country")
        private Set<City> cities = new HashSet<City>(0);
    }   

以下不起作用:

@Override
public List<Country> findAllFetchProfileCities() {
    getSession().enableFetchProfile("countryCities");
    boolean enabled = getSession().isFetchProfileEnabled("countryCities");
    List<Country> list = getSession().createQuery("from Country").list();
    enabled = getSession().isFetchProfileEnabled("countryCities");
    return list;
}

以下工作正常:

@Override
public Country findOneFetchProfileCities(Long _id) {
    getSession().enableFetchProfile("countryCities");
    Country c = (Country) getSession().get(Country.class, _id);
    return c;
}

@Override
public List<Country> findAllCriteriaFetchProfileCities() {
    getSession().enableFetchProfile("countryCities");
    return getSession().createCriteria(Country.class).list();
}
4

2 回答 2

1

我也一直在寻找解决此问题的方法,并发现了我认为可用的解决方法(并不是说这是有效的或任何东西!)

它包括两个步骤:

首先将级联 REFRESH 添加到映射中:

@FetchProfiles({ @FetchProfile( name = "countryCities", 
        fetchOverrides = { @FetchOverride(entity = Country.class, 
                  association = "cities", mode = FetchMode.JOIN) }) })
public class Country implements java.io.Serializable {

    @Id
    private long id;
    @Version
    private int version;
    private String country;
    @OneToMany(mappedBy = "country", cascade = {CascadeType.REFRESH})
    private Set<City> cities = new HashSet<City>(0);
}   

然后引入一个循环来刷新列表检索到的对象:

@Override
public List<Country> findAllFetchProfileCities() {
    getSession().enableFetchProfile("countryCities");
    boolean enabled = getSession().isFetchProfileEnabled("countryCities");
    List<Country> list = getSession().createQuery("from Country").list();
    enabled = getSession().isFetchProfileEnabled("countryCities");

    for (Country c:list) {
        getSession().refresh(c);
    }

    return list;
}

这很丑陋,但它让我走得更远。

于 2014-01-10T12:43:18.973 回答
0

休眠Fetch策略在 Criteria API (criteria.setFetchMode()) 和 HQL ("FETCH JOIN") 中都可用。

因此,当我们编写 hql 时,我们必须在查询中提及关键字“JOIN”它自己存在,我想

有点旧,但请参考一次

休眠硬事实

于 2013-02-21T18:37:36.837 回答