从db获取最新行的两种方法

时间:2011-09-22 06:58:21

标签: mysql hibernate java-ee jpa

我有一个带有spring事务的struts2应用程序和带有hibernate的JPA2。问题是我在数据库中有一些由外部源(一些mysql触发器)更改的行,而在我的前端应用程序中,我有一个ajax脚本,每2秒检查一次这个值。我总是需要获得最新值,而不是缓存值,为此我找到了2个解决方案:

String sql = "FROM MyEntity WHERE xId=:id AND connect!=0 AND complete=0 AND (error=NULL OR error=0)";
  Query q = this.em.createQuery(sql).setHint("org.hibernate.cacheable", false).setParameter("agId", agentId);      
        rs = q.getResultList();
        if(rs.size() == 1){
            intermedObj = (Intermed) rs.get(0);
        }

和另一个:

 String sql = "FROM MyEntity WHERE xxId=:id AND connect!=0 AND complete=0 AND (error=NULL OR error=0)";
        Query q = this.em.createQuery(sql).setParameter("agId", agentId);
        rs = q.getResultList();
        if(rs.size() == 1){
            intermedObj = (Intermed) rs.get(0);
            //get latest object from DB
            em.refresh(intermedObj);
        }

em是EntityManager的一个实例,由spring管理。

所以,问题是:哪个是这两个方法的最佳方法?或者也许有一个更好的?


所以你是对的,我在那里使用了hql,我仍然需要学习很多关于hibernate jpa和java的知识。所以我想在JPQL中编写该cod的正确方法是:

 String sql = "SELECT m FROM MyEntity m WHERE m.xxId=:id AND m.connect!=0 AND m.complete=0 AND (m.error!=1)";
        Query q = this.em.createQuery(sql).setParameter("agId", agentId);
        rs = q.getResultList();
        if(rs.size() == 1){
            intermedObj = (Intermed) rs.get(0);
            //get latest object from DB
            em.refresh(intermedObj);
        }

所以问题是,这是确保我从DB获得最新行而不是缓存记录的正确方法吗?

关于leve2缓存问题,我不知道这是否被激活。我该如何检查?

0 个答案:

没有答案