NHibernate manytomy and eager loading:SetFetchmode与SetResultTransformer和SetMaxResult组合的奇怪结果集
我有一种多对多的关系,我试着去争取:NHibernate manytomy and eager loading:SetFetchmode与SetResultTransformer和SetMaxResult组合的奇怪结果集,nhibernate,many-to-many,Nhibernate,Many To Many,我有一种多对多的关系,我试着去争取: *.CreateCriteria(typeof(Class1)) .SetFetchMode("Class2", FetchMode.Eager) .SetResultTransformer(new DistinctRootEntityResultTransformer()) .SetFirstResult(20) .SetMaxResult(10) .List<Class1>(); *.CreateCriteria(typeof(Class1
*.CreateCriteria(typeof(Class1))
.SetFetchMode("Class2", FetchMode.Eager)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetFirstResult(20)
.SetMaxResult(10)
.List<Class1>();
*.CreateCriteria(typeof(Class1))
.SetFetchMode(“Class2”,FetchMode.Eager)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.SetFirstResult(20)
.SetMaxResult(10)
.List();
我希望返回第20-30行,但我得到的是12-18行。为什么?因为SetResultTransformer是在SetMaxResult之后执行的。它返回从第20行开始的10行,但随后它被区分(这是一个单词吗?)并产生第12-18行。
我完全理解发生了什么,但想不出使用标准的解决方案
有人能解决这个问题吗?我实际上没有尝试过这个,但它可能会奏效
*.CreateCriteria(typeof(Class1))
.SetFirstResult(20)
.SetMaxResult(10)
.CreateCriteria("Class2", JoinType.LeftOuterJoin)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Class1>();
*.CreateCriteria(typeof(Class1))
.SetFirstResult(20)
.SetMaxResult(10)
.CreateCriteria(“Class2”,JoinType.LeftOuterJoin)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.List();
编辑:这不起作用。
使用multiquery、multicriteria(或者使用NH的新版本时使用Future)我也有同样的问题。使用分离的条件和子查询对以下内容进行调整看起来可能是有希望的。等我有时间的时候,我会做一次更彻底的试验
这是因为SetMaxResults方法在“低级别”工作。 我的意思是,SetMaxResults导致NHibernate生成的SQL语句包含
TOP
或LIMIT
子句
当然,当您使用急切抓取模式时,这会导致这些奇怪的结果,因为急切抓取模式会导致连接
因此,如果有两个表以一对多的关系连接在一起,那么NHibernate返回的记录集就是这样的
1 recordA-fromTable1 1 recordX-fromTable2
2 recordA-fromTable1 2 recordY-fromTable2
3 recordB-fromTable1 3 record2-fromTable2
如果对上述记录集执行“TOP 2”,NHibernate将只能从中提取一个实体,因为结果集中的前2条记录实际上是针对同一实体的
我通过使用一个分离的子查询解决了这个问题,该子查询包含TOP子句,并检索必须检索的实体的ID。public List getData(int-to,int-from,
public List<Employee> getData(int to, int from,
String searchField, String searchString, String searchOper,
String sord, String sidx) {
Criteria hCriteria = null;
List<Employee> viewDataList = null;
List<Employee> exactDataList = null;
try {
hSession = HibernateSessionFactory.getSession();
hTransaction = hSession.beginTransaction();
hCriteria = hSession.createCriteria(Employee.class);
if (searchString != null && searchField != null
&& searchOper != null) {
if (searchOper.equalsIgnoreCase("eq"))
hCriteria.add(Restrictions
.eq(searchField, searchString));
if (searchOper.equalsIgnoreCase("ne"))
hCriteria.add(Restrictions.ne(searchField, searchString));
if (searchOper.equalsIgnoreCase("lt"))
hCriteria.add(Restrictions.lt(searchField, searchString));
if (searchOper.equalsIgnoreCase("le"))
hCriteria.add(Restrictions.le(searchField, searchString));
if (searchOper.equalsIgnoreCase("gt"))
hCriteria.add(Restrictions.gt(searchField, searchString));
if (searchOper.equalsIgnoreCase("ge"))
hCriteria.add(Restrictions.ge(searchField, searchString));
if (searchOper.equalsIgnoreCase("cn"))
hCriteria.add(Restrictions.ilike(searchField, searchString,
MatchMode.ANYWHERE));
}
if (sord != null && sidx != null && !sidx.equals("")) {
if (sord.equals("asc"))
hCriteria.addOrder(Order.asc(sidx));
else
hCriteria.addOrder(Order.desc(sidx));
}
/*
hCriteria.setFirstResult(to);
hCriteria.setFirstResult(from);
*/
hCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
viewDataList = hCriteria.list();
// for limit
exactDataList=viewDataList.subList(from,to);
hTransaction.commit();
} catch (Exception e) {
hTransaction.rollback();
} finally {
try {
hSession.flush();
HibernateSessionFactory.closeSession();
} catch (Exception hExp) {
}
}
return exactDataList;
}
字符串搜索字段,字符串搜索字符串,字符串搜索运算符,
字符串排序,字符串sidx){
标准hCriteria=null;
List viewDataList=null;
List exactDataList=null;
试一试{
hSession=HibernateSessionFactory.getSession();
hTransaction=hsSession.beginTransaction();
hCriteria=hSession.createCriteria(Employee.class);
if(searchString!=null&&searchField!=null
&&searchOper!=null){
if(搜索操作等效信号案例(“eq”))
hCriteria.add(限制)
.eq(searchField,searchString));
if(搜索操作同等信号(“ne”))
添加(Restrictions.ne(searchField,searchString));
if(搜索操作同等信号(“lt”))
添加(Restrictions.lt(searchField,searchString));
if(搜索操作等效信号案例(“le”))
add(Restrictions.le(searchField,searchString));
if(搜索操作同等信号(“gt”))
添加(Restrictions.gt(searchField,searchString));
if(搜索操作同等信号(“ge”))
添加(Restrictions.ge(searchField,searchString));
if(搜索操作等效信号(“cn”))
hCriteria.add(Restrictions.ilike)(searchField、searchString、,
匹配模式;
}
if(sord!=null&&sidx!=null&&sidx.equals(“”){
如果(排序等于(“asc”))
hCriteria.addOrder(Order.asc(sidx));
其他的
hCriteria.addOrder(Order.desc(sidx));
}
/*
hCriteria.setFirstResult(to);
hCriteria.setFirstResult(来自);
*/
hCriteria.setResultTransformer(Criteria.DISTINCT\u ROOT\u实体);
viewDataList=hCriteria.list();
//限制
exactDataList=viewDataList.subList(从、到);
hTransaction.commit();
}捕获(例外e){
hTransaction.rollback();
}最后{
试一试{
hSession.flush();
HibernateSessionFactory.closeSession();
}捕获(异常hExp){
}
}
返回数据列表;
}
我试过了。它不起作用。它的问题与原来的帖子完全相同。我现在知道,这是不可能的,因为这是一个非常低效的查询。您应该使用multiquery您是否可以提供更多关于如何使用multicriteria、multiquery和Future特性的详细信息(最好是针对这个问题的示例)?我也有同样的问题,我不太确定如何使用上面提到的功能来实现这个问题的目标。Nathan,你可能想读一下:没有解决方案,但知道原因。。。这是战斗的一半以上。见答案。类似于?