我有一些类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<LoginSession> 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);
问题是提取始终是懒惰的。如何让它成为渴望(通过标准,而不是通过属性注释)?
注意:
如果我在注释中设置的@Fetch
响应提取之上添加private Set<LoginSession> userLoginSession
注释(我不会按标准setFetchMode
进行自定义)。
字段的名称(setFetchMode
方法的第一个参数)是否正确?
答案 0 :(得分:5)
如上所述here您无法同时过滤和急切获取集合。你可以用相关的子查询解决它:
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);
注意:这是我头脑中的文本编辑器代码。方法名可能会有所不同
答案 1 :(得分:1)
尝试:
Criteria crt = session.createCriteria(User.class);
crt.setFetchMode("sessions", FetchMode.JOIN);
答案 2 :(得分:1)
尝试以下
Criteria crit = session.createCriteria(User.class);
crit.setFetchMode("session.userId", FetchMode.EAGER);
User myThingy = (User)crit.uniqueResult();
答案 3 :(得分:1)
尝试在别名上设置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);