从你的代码开始。
@SuppressWarnings({ "unchecked", "rawtypes" })
public List<Profession> getProfessionById(long id) throws Exception {
session = sessionFactory.openSession();
Criteria cr = session.createCriteria(Profession.class);
cr.add(Restrictions.eq("uid", id));
List results = cr.list();
tx = session.getTransaction();
session.beginTransaction();
tx.commit();
return results;
}
我首先建议您在使用Spring时使用Transactional注释。它可以使代码更清晰。然后停止使用SuppressWarnings,这很丑陋且无用,您可以配置IDE来隐藏它们。
@Transactionnal(readonly = true)
public List<Profession> getProfessionById(long id) throws Exception {
Criteria cr = session.createCriteria(Profession.class);
cr.add(Restrictions.eq("uid", id));
List results = cr.list();
return results;
}
现在标准是使用流畅的API,并不需要创建本地变量。
@Transactionnal(readonly = true)
public List<Profession> getProfessionById(long id) throws Exception {
return session
.createCriteria(Profession.class)
.add(Restrictions.eq("uid", id))
.list();
}
现在让我们解决你的问题。
@Transactionnal(readonly = true)
public List<Profession> getProfessionById(long id) throws Exception {
return session
.createCriteria(Profession.class)
.add(Restrictions.eq("uid", id))
.setFetchMode("users", FetchMode.JOIN)
.list();
}
当然,这需要与职业相关的这行代码;
public class Profession {
[...]
@OneToMany(mappedBy = "profession")
private Set<Users> users = new HashSet<>();
[...]
}
警告
不需要使用getter/setter,在不需要时不要调用反向映射。
请确保不要在实体中将用户声明为Eagerly获取,否则每次加载由许多用户拥有的职业时都会出现可怕的问题,即使您自己无法很好地获取它们。
不要使用List,Hibernate不太喜欢没有排序声明的List。
不要使用FetchMode.EAGER,它已经过时了!