模型是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(请参阅提供的代码中的注释)。
我的标准做错了什么,如何成为一个查询?
由于
答案 0 :(得分:1)
这是Hibernate(和大多数ORM)工作的方式:它们只在实际需要时才从其他表中延迟加载关系。如果他们没有,当你想要的只是一个对象时,你可以加载相当大的数据库部分。
可以按关系关系禁用延迟加载,如this StackExchange answer中所述。但是,这意味着它将始终被禁用,因此在执行此操作之前,请确保这确实是一件坏事。
我不会说你所描述的情况是件坏事。