Оптимизация выполнения запросов для обработки повторяющихся идентификаторов клиентовJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Оптимизация выполнения запросов для обработки повторяющихся идентификаторов клиентов

Сообщение Anonymous »

У меня есть схема, похожая на показанную, и мне нужно получить информацию о транзакции.
[img]https://i .sstatic.net/xVhLpCri.jpg[/img]

Я хочу сопоставить записи из таблицы CUSTOMER с записями в таблице TRANSACTION.
Предыдущее мы полагались исключительно на Поле CUSTOMER_ID для сопоставления.
Однако мы заметили, что таблица TRANSACTION содержит несколько записей с одним и тем же CUSTOMER_ID.
Чтобы решить эту проблему, нам необходимо определить алгоритм, который может обрабатывать случаи множественных совпадений. записи для одного и того же CUSTOMER_ID.
Решение должно соответствовать следующим критериям:

[*]TRANSACTION.CUSTOMER_ID = CUSTOMER.CUSTOMER_ID.
[*]SUBSTR(TRANSACTION.ACCOUNT_NUMBER, INSTR(TRANSACTION.ACCOUNT_NUMBER, '.') + 1) = CUSTOMER.ACCOUNT_NUMBER.
[*] ТРАНЗАКЦИЯ.АДРЕС = КЛИЕНТ.АДРЕС (это условие должно быть необязательным, если поле АДРЕС существует).
[*]В случаях совпадения нескольких строк выберите транзакцию с самой ранней ISSUE_DATE, при условии, что CUSTOMER.CREATED_AT {
StringBuffer qryStr = new StringBuffer() //
.append(
"SELECT "
+ " er.CUSTOMER_ID, "
+ " er1.ID, "
+ " er1.DESCRIPTION, "
+ " er1.REFERENCE_NUMBER, "
+ " er1.CATEGORY "
+ " FROM TRANSACTION er "
+ " INNER JOIN DETAILS er1 "
+ " ON (er.ID = er1.EM_ID) "
+ " WHERE "
);

String inCustomerIdList = NativeQuerySupport.inClause(batch);
qryStr.append(" er.CUSTOMER_ID IN ").append(inCustomerIdList);
Query query = em.createNativeQuery(qryStr.toString());

results.addAll(query.getResultList());
});

ret = results.stream()
.map(erm -> Details.toModel(erm))
.collect(Collectors.toList());

return ret;
}
[/code]
Итак, я думаю, что параметром метода должен быть список всех полей CUSTOMER.

Код: Выделить всё

public List searchTransactions(List criteria)

and the query to be as below
StringBuffer qryStr = new StringBuffer() //
.append(
"SELECT "
+ " er.CUSTOMER_ID, "
+ " er1.ID, "
+ " er1.DESCRIPTION, "
+ " er1.REFERENCE_NUMBER, "
+ " er1.CATEGORY "
+ " FROM TRANSACTION er "
+ " INNER JOIN DETAILS er1 "
+ " ON (er.ID = er1.EM_ID) "
+ " WHERE er.CUSTOMER_ID = ?customerId "
+ " AND SUBSTR(er.ACCOUNT_NUMBER, INSTR(er.ACCOUNT_NUMBER, '.') + 1) = ?accountNumber "
+ " AND (er.ADDRESS = ?address OR ?address IS NULL ) "
+ " AND er.ISSUE_DATE = ( "
+ "  SELECT MIN(em2.ISSUE_DATE) "
+ "    FROM TRANSACTION em2 "
+ "   WHERE er.CUSTOMER_ID = em2.CUSTOMER_ID "
+ "     AND er.ACCOUNT_NUMBER = em2.ACCOUNT_NUMBER "
+ "     AND (er.ADDRESS = em2.ADDRESS OR ?address IS NULL )"
+ "     AND em2.ISSUE_DATE >= ?createdAt)");

Query query = em.createNativeQuery(qryStr.toString());
query.setParameter("customerId", criteria.getCustomerId());
query.setParameter("accountNumber", criteria.getAccountNumber());
query.setParameter("address", criteria.getAddress());
query.setParameter("createdAt", criteria.getCreatedAt());
При описанном выше подходе мне нужно выполнить столько запросов, сколько имеется критериев, что сводит на нет преимущества в производительности, полученные от пакетной обработки в предыдущей реализации.
Есть ли лучший способ справиться с этой проблемой?
Например, можем ли мы использовать предыдущий запрос для получения всех необходимых данных, а затем, в случае дублирования CUSTOMER_ID, сделать второй запрос для разрешения конфликтов?>

Подробнее здесь: https://stackoverflow.com/questions/793 ... stomer-ids
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»