如何使用hibernate批量选择数据?

时间:2012-03-05 16:49:41

标签: hibernate batch-processing

我有一个基本上从表中返回整个数据的函数。如何实现批量提取,以便一次批量返回60,000行数据。

以下逻辑适用于此方案吗?

http://javainnovations.blogspot.com/2008/07/batch-insertion-in-hibernate.html

5 个答案:

答案 0 :(得分:2)

要批量选择数据,您可以通过设置初始位置和数据来应用数据分页。要为查询提取的结果数。

for(int i=0; i < MAX_SIZE; i = i + BATCH_SIZE){

    List<Object> resultList = entityManager.createQuery(SQL_QUERY).setFirstResult(i).setMaxResults(BATCH_SIZE).getResultList();

    //-- Batch Computation
} 

我提供了示例代码,可以相应地修改它。

答案 1 :(得分:1)

要使用hibernate选择数据,请在hibernate.properties中使用参数设置获取大小:

hibernate.jdbc.fetch_size= SOME_VALUE

或在查询中:

.setFetchSize(SOME_VALUE)

如果要更新数据使用:batch_size

hibernate.jdbc.batch_size= SOME_VALUE

答案 2 :(得分:0)

hibernate.properties中,使用参数

设置批量大小
hibernate.jdbc.batch_size= 'your_value'

答案 3 :(得分:0)

@ nayan-wadekar

批处理的更新形式。他先前的评论将导致以下提到的以下异常,因为在获取数据时,即使在显式类型转换之后,它也无法在运行时获取正确的对象类型。

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Object

为了获取任何对象类型的结果列表,请使用以下方法:

for(int i=0; i < MAX_SIZE; i = i + BATCH_SIZE){

    List<AnyObject> resultList = entityManager.createQuery(SQL_QUERY, AnyObject.class).setFirstResult(i).setMaxResults(BATCH_SIZE).getResultList();

    //-- Batch Computation
} 

答案 4 :(得分:0)

我遇到了同样的问题,想批量获取记录,但又不触发单独的查询。我遇到了弗拉德(Vlad)的帖子here。为此,它使用Java 8 Stream。将经过稍微修改的原始代码放在下面。

Stream<Post> postStream = sessionFactory
        .getCurrentSession()
        .createNativeQuery(
            "SELECT p " +
                "FROM post p " +
                "ORDER BY p.created_on DESC", Post.class)
        .setHint( QueryHints.HINT_FETCH_SIZE, 50 )
        .getResultStream();

stream.forEach(x -> System.out.println(x));