我无法使@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();
}
答案 0 :(得分: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;
}
这很丑,但它让我更进一步。
答案 1 :(得分:0)
hibernate Fetch
策略在Criteria API(criteria.setFetchMode())和HQL(“FETCH JOIN”)中都可用。
因此,当我们编写hql时,我们必须提到关键词“JOIN”它在查询中自我,我认为。
有点旧,但请参考一次