代码之家  ›  专栏  ›  技术社区  ›  flybywire

Hibernate:如何从可滚动结果中检索实体?

  •  5
  • flybywire  · 技术社区  · 15 年前

    我执行一个返回实体列表的查询。如何从 ScrollableResults :

     Session s  = ....;
     Query q = s.createQuery("....") # returns 100000s rows
     ScrollableResults sr = q.scroll();
     sr.scroll(45999); # just a number
     Employee employee = ???
    

    在最后一行代码中如何获取员工

    4 回复  |  直到 9 年前
        1
  •  6
  •   Bozho    15 年前

    试试 get(0) 方法,或 get()[0]

        2
  •  2
  •   ChssPly76    15 年前

    以下是指向API的链接: ScrollableResults

    get() 返回整个当前行, get(index) 返回位于的对象 index 定位而不初始化其余部分。还有一组方便的getxxx()方法将结果强制转换为给定的类型。

        3
  •  0
  •   Gray droiddeveloper    10 年前

    为了改进其他答案, ScrollableResults 是否为您转换实体,尽管这并没有立即从javadocs中清除。

    正如@bozho所说,打电话给 sr.get() 将返回当前位置但包装在数组中的实体。在查看代码时 ScrollableResultsImpl 当前行的结果设置为:

        if ( result != null && result.getClass().isArray() ) {
            currentRow = (Object[]) result;
        } else {
            currentRow = new Object[] { result };
        }
    

    所以 ScrollableResults.get() 始终返回结果数组,如果您的实体是 一个数组,它将位于 get()[0] .

    因此,使用您的代码,您可以执行如下操作:

    while (sr.next()) {
       // get the entity which is the first element in an Object[]
       Employee employee = sr.get()[0];
       ...
    }
    
        4
  •  0
  •   Anurag Dwivedi    9 年前

    要检索实体,最简单的方法是将对象强制转换为所需的对象: 例如:

    ScrollableResults sr = q.scroll();
    while (sr.next()) {
        CustomObject object = (CustomObject) sr.get()[0]; // Now CustomObject will have all the properties mapped
    }
    

    这对于所有的场景都是完美的。