我有一个基本上从表中返回整个数据的函数。如何实现批量提取,以便一次批量返回60,000行数据。
以下逻辑适用于此方案吗?
http://javainnovations.blogspot.com/2008/07/batch-insertion-in-hibernate.html
答案 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));