Hibernate急切加载查询

时间:2014-09-13 13:09:53

标签: java sql hibernate orm hibernate-criteria

模型是user可以有多个LoginSessions(LogginSession只能与一个用户相关)。
我想要实现的是为用户带来相关的LoginSession(在查询中提供的令牌)。 所有这些我只想做一个查询,并且这样做我想使用急切加载,这是我的代码:

我有这段代码:

    LoginSession loginSession = new LoginSession();
    loginSession.setToken(sessionToken);

    //Example loginSessionExample = Example.create(loginSession);

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

List<?> usersList = (List<?>) crit.list(); // first query

if(usersList.size() == 1)
{
    User user = (User) usersList.get(0);
    LoginSession loginSession = (LoginSession) user.getUserLoginSession().toArray()[0]; //second query
    ...

问题是正在执行2个quires(请参阅提供的代码中的注释)。

我的标准做错了什么,如何成为一个查询?

由于

1 个答案:

答案 0 :(得分:1)

这是Hibernate(和大多数ORM)工作的方式:它们只在实际需要时才从其他表中延迟加载关系。如果他们没有,当你想要的只是一个对象时,你可以加载相当大的数据库部分。

可以按关系关系禁用延迟加载,如this StackExchange answer中所述。但是,这意味着它将始终被禁用,因此在执行此操作之前,请确保这确实是一件坏事。

我不会说你所描述的情况是件坏事。