如何在 Hibernate 中为通用可滚动结果编写条件或 HQL?
How to write a criteria or HQL for generic scrollable results in Hibernate?
在我目前的批处理项目中,我需要编写一个条件或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 );
但问题是:
- 如何在 Hibernate 会话中实现
WHERE
条件?
- 如何知道当前实体的标识符类型?
我正在使用标准。如果HQL更简单,那么我可以接受HQL。 Hibernate 版本是 5x.
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 );
在我目前的批处理项目中,我需要编写一个条件或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 );
但问题是:
- 如何在 Hibernate 会话中实现
WHERE
条件? - 如何知道当前实体的标识符类型?
我正在使用标准。如果HQL更简单,那么我可以接受HQL。 Hibernate 版本是 5x.
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 );