如何在Hibernate中为通用可滚动结果编写标准或HQL?

时间:2016-07-06 19:50:32

标签: java hibernate hql criteria

在我目前的批处理项目中,我需要编写一个条件或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。

1 个答案:

答案 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 );