Java 忽略Hibernate获取条件
我有一些类User,它与LoginSession类有一对多的关系(我的User类中有一组LoginSessions) 我有这样的标准:Java 忽略Hibernate获取条件,java,hibernate,fetching-strategy,Java,Hibernate,Fetching Strategy,我有一些类User,它与LoginSession类有一对多的关系(我的User类中有一组LoginSessions) 我有这样的标准: Criteria crit = session.createCriteria(User.class); crit.setFetchMode("loginSession", FetchMode.JOIN); crit.createAlias("userLoginSession", "session"); crit.add(Restrictions.eq("sess
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 userLoginSession
注释中设置的响应获取(我不希望它由标准setFetchMode
自定义)
字段名称(setFetchMode方法的第一个参数)是否正确?
问题:
试试:
Criteria crt = session.createCriteria(User.class);
crt.setFetchMode("sessions", FetchMode.JOIN);
试着跟随
Criteria crit = session.createCriteria(User.class);
crit.setFetchMode("session.userId", FetchMode.EAGER);
User myThingy = (User)crit.uniqueResult();
尝试在别名上设置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);
如上所述,您不能同时筛选和获取集合。您可以使用相关子查询解决此问题:
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);
注意:这是我头顶上的文本编辑器代码。方法名可能会有所不同检查这个@Killer,我不知道它如何帮助meCriteria criteria=session.createCriteria(User.class);setFetchMode(“会话”,FetchMode.JOIN);List=criteria.List();根据我需要使用JOIN的文档,不推荐使用EAGER。好的,您是否得到意外的结果或某些异常。怎么了?你如何测试你的代码?setFetchingMethod什么都不做。这就是问题所在。我看到在获取用户时有一个查询(如代码中所示),在访问关系时有另一个查询。您是否使用注释进行映射?是的,您可以在问题中看到这是不推荐的:(什么是不推荐的?在稳定版本中,您可以使用createAlias(String associationPath、alias、joinType)(,java.lang.String,org.hibernate.sql.JoinType))我正在使用hibernate 4,eclipse指出它已被弃用。您能看看我作为字符串提供给setFetchingMethod的名称吗?
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);
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);