У меня есть две таблицы с некоторыми похожими полями, которые асинхронно заполняются из двух разных API. В каждой таблице есть идентификатор компании и некоторые другие поля. В конце каждого дня я хочу объединить последние данные каждой компании из каждой таблицы.
Я написал следующий код:
if (cmpID == null)
cmpID = readCompanyTable();
int pageSize = 1;
CriteriaBuilder criteriaBuilder = emn.getCriteriaBuilder();
CriteriaQuery<LegalEntity> criteriaQueryLegal = criteriaBuilder.createQuery(LegalEntity.class);
Root<LegalEntity> rootLegal = criteriaQueryLegal.from(LegalEntity.class);
criteriaQueryLegal = criteriaQueryLegal.select(rootLegal);
criteriaQueryLegal.orderBy(criteriaBuilder.desc(rootLegal.get("timeStamp")));
CriteriaQuery<PriceRealTimeEntity> criteriaQueryPrice = criteriaBuilder.createQuery(PriceRealTimeEntity.class);
Root<PriceRealTimeEntity> rootPrice = criteriaQueryPrice.from(PriceRealTimeEntity.class);
criteriaQueryPrice = criteriaQueryPrice.select(rootPrice);
criteriaQueryPrice.orderBy(criteriaBuilder.desc(rootPrice.get("dateTime")));
ArrayList<Long> list = new ArrayList<>();
list = getCompanyID();
for (Long com_id : list) {
Predicate predicateLegal = criteriaBuilder.equal(rootLegal.get("companyID"), com_id);
criteriaQueryLegal.where(predicateLegal);
Predicate predicatePrice = criteriaBuilder.equal(rootPrice.get("companyID"), com_id);
criteriaQueryPrice.where(predicatePrice);
TypedQuery<LegalEntity> typedQueryLegal = emn.createQuery(criteriaQueryLegal);
typedQueryLegal.setFirstResult(0);
typedQueryLegal.setMaxResults(pageSize);
TypedQuery<PriceRealTimeEntity> typedQueryPrice = emn.createQuery(criteriaQueryPrice);
typedQueryPrice.setFirstResult(0);
typedQueryPrice.setMaxResults(pageSize);
List<LegalEntity> resultsLegal = typedQueryLegal.getResultList();
List<PriceRealTimeEntity> resultsPrice = typedQueryPrice.getResultList();
if ( (resultsLegal.isEmpty()) || (resultsPrice.isEmpty()))
continue;
try {
DailyEntity den = new DailyEntity(resultsPrice.get(0), resultsLegal.get(0),
cmpID.get(Long.valueOf(com_id)).doubleValue(), addr_data.get(1));
drep2.save(den);
} catch (Exception e) {
}
}
Сначала я получаю список компанийИдентификаторы из таблицы. Создавайте параллельные запросы и объединяйте данные. Я знаю, что этот метод очень интуитивен и тривиален, и я ищу лучшее решение. Этот метод очень очень медленный.
Еще одно примечание: я измерил продолжительность работы каждого блока кода. Эта часть:
List<LegalEntity> resultsLegal = typedQueryLegal.getResultList();
List<PriceRealTimeEntity> resultsPrice = typedQueryPrice.getResultList();
занимает около 0,5 секунды для запуска. Это очень медленно.