2

我有一些类 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方法的第一个参数)是否正确?

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

4

4 回答 4

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);

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

于 2014-09-22T07:22:06.770 回答
1

尝试关注

Criteria crit = session.createCriteria(User.class);
crit.setFetchMode("session.userId", FetchMode.EAGER);
User myThingy = (User)crit.uniqueResult();
于 2014-09-15T06:07:08.430 回答
1

尝试:

 Criteria crt = session.createCriteria(User.class);
 crt.setFetchMode("sessions", FetchMode.JOIN);
于 2014-09-15T05:33:50.207 回答
1

尝试在别名上设置连接类型:

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);
于 2014-09-17T07:55:27.970 回答