4

我有一个多对多的关系,我试图渴望得到:

*.CreateCriteria(typeof(Class1))
.SetFetchMode("Class2", FetchMode.Eager)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetFirstResult(20)
.SetMaxResult(10)
.List<Class1>();

我想返回第 20-30 行,但我有 12-18 行。为什么?因为 SetResultTransformer 在 SetMaxResult 之后执行。它从第 20 行开始返回 10 行,但随后它被区分(这是一个词吗?)导致第 12-18 行。我完全理解发生了什么,但想不出使用标准的解决方案......

有没有人有解决方案?

4

4 回答 4

1

这是因为 SetMaxResults 方法在“低级别”工作。我的意思是,SetMaxResults 导致 NHibernate 生成的 SQL 语句包含TOPorLIMIT子句。

当然,当您使用急切获取模式时,这会导致那些奇怪的结果,因为急切获取模式会导致 JOIN。

因此,如果您有 2 个以一对多关系连接在一起的表,则 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。

于 2011-08-31T21:13:27.043 回答
0

我实际上并没有尝试过,但它可能会起作用。

  *.CreateCriteria(typeof(Class1))
    .SetFirstResult(20)
    .SetMaxResult(10)
    .CreateCriteria("Class2", JoinType.LeftOuterJoin)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Class1>();

编辑:这不起作用。使用多查询、多条件(或使用新版本的 NH 时的 Future)

于 2009-02-16T20:59:00.797 回答
0

我也有同样的问题。使用分离的标准和子查询对以下内容进行改编看起来可能很有希望。当我有时间时,我将对其进行更彻底的试验。

http://blogs.taiga.nl/martijn/2008/11/20/nhibernate-criteria-queries-across-multiple-many-many-associations/

于 2009-03-06T18:21:25.270 回答
0
 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;

}
于 2012-07-04T06:21:05.497 回答