忽略了标准中的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);