忽略了标准中的Hibernate提取

我有一些类User与LoginSession类有一对多关系(我的User类中有一个LoginSessions集合)。

@Entity(name="T_User") public class User() { .... @OneToMany(fetch=FetchType.LAZY, mappedBy="user", cascade=CascadeType.ALL) @Fetch(FetchMode.SELECT) @JsonIgnore private Set userLoginSession; .... } 

这是LoginSession类:

 @Entity(name="T_LoginSession") public class LoginSession extends BasicDTO { @ManyToOne @JoinColumn(name="userId") protected User user; ... 

我有这个标准:

 Criteria crit = session.createCriteria(User.class); crit.setFetchMode("loginSession", FetchMode.JOIN); crit.createAlias("userLoginSession", "session"); crit.add(Restrictions.eq("session.token", sessionToken)); crit.setMaxResults(1); crit.setFirstResult(0); crit.setFetchSize(1); 

问题是提取始终是懒惰的。 如何让它成为Eager(通过标准,而不是通过属性注释)?

注意:
如果我在private Set userLoginSession上面添加@Fetch注释,则在注释中private Set userLoginSession响应提取(我不会通过标准setFetchMode自定义)。

字段的名称( setFetchMode方法的第一个参数)是否正确?

问题: 这个错误与我的问题有关吗?

如此处所述,您无法同时过滤和急切获取集合。 你可以用相关的子查询来解决它:

 DetachedCriteria subquery = DetachedCriteria.For(User.class) .createAlias("userLoginSession", "session") .add(Restrictions.eq("session.token", sessionToken)) .setFirstResult(0) .setMaxResults(1) // assuming token is unique otherwise this won't restrict users but loginsessions .setProjection(Projections.id()); Criteria crit = session.createCriteria(User.class) .add(Subqueries.propertyIn("id", subquery) .setFetchMode("userLoginSession", FetchMode.JOIN); 

注意:这是我头脑中的文本编辑器代码。 方法名称可能有所不同

尝试:

  Criteria crt = session.createCriteria(User.class); crt.setFetchMode("sessions", FetchMode.JOIN); 

试试以下

 Criteria crit = session.createCriteria(User.class); crit.setFetchMode("session.userId", FetchMode.EAGER); User myThingy = (User)crit.uniqueResult(); 

尝试在别名上设置jointype:

 Criteria crit = session.createCriteria(User.class); crit.createAlias("userLoginSession", "session", Criteria.INNER_JOIN); crit.add(Restrictions.eq("session.token", sessionToken)); crit.setMaxResults(1); crit.setFirstResult(0); crit.setFetchSize(1); 
Interesting Posts