Hibernate分页

时间:2014-05-09 19:31:17

标签: java hibernate pagination

我有一个标记为" null"的项目表。或者"完成" ,我需要获取空标记的项目,处理它们,将标志设置为完成。

事情是,我想使用分页,我用500项获取500(null标记) 我的设计如下

  1. 我获取500项//生产者
  2. 将它们放入队列
  3. 某个帖子需要这500个项目//消费者
  4. 操作它们并将标记更新为"完成"
  5. 我面临的问题是消费者是非常缓慢的,所以制作人再次获取相同的500部分,所以我去索引,但似乎没有正常工作

    public List<Parts> getNParts(int listSize) {
            try {
    
                criteria = session.createCriteria(Parts.class);
                criteria.setFirstResult(DBIndexGuard.getNextIndex()); //index+=500;
                criteria.add(Restrictions.isNull("Status"));
    
                criteria.setMaxResults(listSize); //list size is 500;
                newPartList = criteria.list();
    
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
    
            }
    
            return newPartList;
        }
    

    我如何实现分页,以便使用这些项目为空标记的条件获取500个不同的500个项目?

4 个答案:

答案 0 :(得分:1)

为生产者 - 消费者类型的问题创建synchronized方法,this教程可以帮助您。

答案 1 :(得分:0)

您可以尝试以下实现之一。     1.消除消费者方面的重复处理。仅在null时设置完成。      2.每当放入队列时,通过维护“进程中”的附加状态来消除生产者的重复。在生成器查询中排除它们。     3.在分页时,按表的主键对记录进行排序,对于后续页面,只查询那些大于上一页最后一条记录主键的记录。

答案 2 :(得分:0)

这个问题很容易通过包含一个状态来解决,比如“处理”。因此,您的制作人会将选择的记录标记为 - &#39;处理&#39;然后消费者可以对他们进行处理,并将他们的状态设置为“完成”。 在这种情况下,生产者不会选择已经选择的记录。

答案 3 :(得分:0)

我解决了它如下

  if (newPartList.isEmpty() || newPartList.size()<DBIndexGuard.getAllowedListSize()) { // AllowedListSize=500                   
    System.out.println("DataFetcher Sleeping");
    inputQueue.offer(newPartList);       
    DBIndexGuard.resetIndex();          
    session.clear();
    TimeUnit.MINUTES.sleep(10);
    }