【问题标题】:Hibernate eager loading with query带有查询的 Hibernate 急切加载
【发布时间】:2014-11-07 12:48:43
【问题描述】:

模型是一个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 个查询(请参阅提供的代码中的 cmets)。

我的 Criteria 做错了什么?如何才能成为一个单一的查询?

谢谢

【问题讨论】:

    标签: java sql hibernate orm hibernate-criteria


    【解决方案1】:

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

    可以按关系禁用延迟加载,如this StackExchange answer 中所述。但是,这意味着它总是会被禁用,所以在你这样做之前,请确保这确实是一件坏事。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多