2 способа получить последнюю строку из БД - PullRequest
1 голос
/ 22 сентября 2011

У меня есть приложение struts2 с весенними транзакциями и 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, который управляется пружиной.

Итак, вопрос в том, какой из этих двух подходов наилучший? Или, может быть, есть лучший?


Так что вы правы, я использовал там hql, мне еще нужно многое узнать о hibernate jpa и java в целом. Итак, я думаю, что правильный способ написания этой трески на JPQL будет:

 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);
        }

Так что вопрос в том, является ли это правильным способом убедиться, что я получил последнюю строку из БД, а не кэшированную запись?

Что касается вопроса о кэше leve2, я не знаю, активирован ли он. Как мне это проверить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...