Как получить размер результата для каждого запроса на выборку, используя критерии и спецификации в источниках? - PullRequest
0 голосов
/ 15 ноября 2018

В JAVA после выполнения запроса я подсчитываю размер набора результатов в общем файле базы данных перед возвратом данных для мониторинга запросов, которые выбирают более 1000 строк. Я хотел бы сделать то же самое в источниках для критериев и запросов спецификации. Как этого добиться?

UPDATE:

Логика Я следую в java при выполнении запроса на отправку почты, когда есть запрос, извлекающий более 2500 результатов.

Vector result = new Vector();
Vector row;
int colIndex;
int rowCount = 0;
int colCount;
ResultSet rst = null;
try {
 rst = executeQuery(xQuery);
 colCount = rst.getMetaData().getColumnCount();
 while (rst.next()) {
  row = new Vector();
  for (colIndex = 1; colIndex <= colCount; colIndex++) {
   if (rst.getString(colIndex) != null && rst.getString(colIndex) != "")
    row.add(colIndex - 1, rst.getString(colIndex));
   else
    row.add(colIndex - 1, " ");
  }
  result.add(rowCount++, row);
 }
 try {
  if (result.size() > 2500) {

   Mailer(dbConn.getConnection().getMetaData().getURL(), xQuery, result.size());
  }
 } catch (Exception e) {

 }

} catch (Exception e) {
 throw e;
} finally {
 if (rst != null) rst.close();
 rst = null;
}
return result;

1 Ответ

0 голосов
/ 17 ноября 2018

Если я правильно понял ваш вопрос, вам нужно будет использовать Критерии гибернации, чтобы определить, имеет ли возвращенный Resultset более 2500 строк.Это может быть достигнуто путем получения списка из Criteria и последующего определения размера списка.Например, скажем, вы запрашиваете таблицу заказов на покупку:

public static List<PurchaseOrders> getPurchaseOrderDetails() {
        List<PurchaseOrders> orders = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(PurchaseOrders.class);
            cr.add(Restrictions.eq("delFlg", "N"));
            ////add whatever other filters here
            orders = cr.list();
            tx.commit();
        } catch (HibernateException asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
        return orders;
    }

Это эквивалентно:

select * from purchase_orders where del_flg = 'N';

Обратите внимание, что PurchaseOrders - это ваш класс jpa, имеющий базу данныхсопоставление объектов.Поскольку у вас уже есть список здесь, вы всегда можете проверить его размер.

public static void sendAlert() {
        List<PurchaseOrders> orders = getPurchaseOrderDetails();
        int size = orders.size();
        if(size > 2500){
            ///Initiate alerts
        }
    }

Надеюсь, это поможет.

ОБНОВЛЕНИЕ Если вам нужно покрыть все своизапросы в одном методе, вам нужно написать общий метод:

public static <T> List<T> getDetails(Class<T> c, Map<String, ?> params) {
        List<T> details = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(c);
            params.entrySet().forEach((entry) -> {
                cr.add(Restrictions.eq(entry.getKey(), entry.getValue()));
            });
            details = cr.list();
            tx.commit();
        } catch (HibernateException asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
        return details;
    }

, а затем заполнить параметры для ваших различных запросов и таблиц.

...