在我目前的批处理项目中,我需要编写一个条件或HQL来获取通用的可滚动结果,以便逐个处理实体。处理完毕后,实体ID将保存为检查点,称为checkpointId
。如果需要重新启动作业,则将创建另一个可滚动查询,并将使用checkpointId
启动。在此批处理作业中,接受了@Id
的所有类型的实体。
如果我翻译成SQL,它将与下面的语句类似,FETCH NEXT
。
SELECT * FROM my_table WHERE id > checkpoint_id LIMIT 1
如果我用Java实现它,那就变成了:
Class<?> entityType = MyClass.class;
ScrollableResults scrollableResults = session
.createCriteria( entityType )
.setCacheable( false )
.setFetchSize( 1 )
//
// TODO: where id > checkpointId
//
.setMaxResults( maxResults )
.scroll( ScrollMode.FORWARD_ONLY );
但问题是:
WHERE
条件?我正在使用标准。如果HQL更容易,那么我可以接受HQL。 Hibernate版本是5x。
答案 0 :(得分:0)
Class<?> entityType = MyClass.class;
ClassMetadata md = sessionFactory.getClassMetadata( entityType );
ScrollableResults scrollableResults = session
.createCriteria( entityType )
.setCacheable( false )
.setFetchSize( 1 )
.add( Restrictions.gt( md.getIdentifierPropertyName(), checkpointId ))
.setMaxResults( maxResults )
.scroll( ScrollMode.FORWARD_ONLY );