В настоящее время я работаю над функционалом, который позволит системе осуществлять поиск квитанций общедоступных сервисов по комбинации из 6 параметров, которые могут иметь значение null, что означает, что квитанции не должны фильтроваться этим параметром: accountNumber, amountRangeMin, amountRangeMax, dateRangeMin , dateRangeMax, publicServiceId. Однако создание метода для каждой комбинации параметров не вариант, я думаю, что должен быть лучший способ, сначала мой подход был следующим:
На моем Сервисе у меня есть этот метод:
public Map<String,Object> findPublicServiceReceiptsByParams(Integer accountNumber, BigDecimal amountRangeMin,
BigDecimal amountRangeMax, LocalDate dateRangeMin, LocalDate dateRangeMax, Integer publicServiceId) {
Map<String,Object> publicServiceReceipts = new HashMap<String,Object>();
String accountNumberFilter = !(accountNumber==null) ? accountNumber.toString() : "AccountNumberTableName";
String amountRangeMinFilter = !(amountRangeMin==null) ? amountRangeMin.toString() : "table.AmountColumnName";
String amountRangeMaxFilter = !(amountRangeMax==null) ? amountRangeMax.toString() : "table.AmountColumnName";
String dateRangeMinFilter = !(dateRangeMin==null) ? dateRangeMin.toString() : "Table.ReceiptCreationDateColumn";
String dateRangeMaxFilter = !(dateRangeMax==null) ? dateRangeMax.toString() : "Table.ReceiptCreationDateColumn";
String publicServiceIdFilter = !(publicServiceId==null) ? publicServiceId.toString() : "table.publicServiceIdColumn";
publicServiceReceipts = publicServiceReceiptRepository.findPublicServiceReceiptsByParams(accountNumberFilter,
amountRangeMinFilter, amountRangeMaxFilter, dateRangeMinFilter, dateRangeMaxFilter,
publicServiceIdFilter);
return publicServiceReceipts;
}
А потом в моем хранилище было:
final static String FIND_PUBLIC_SERVICES_BY_ARGS = "Select (Insert whatever logic should go in here to select columns from receipts the where clause is the one that matters)"
+ " WHERE ACT.ACT_AccountNumber=:accountNumberFilter\n"
+ " AND PSE.PSE_Id=:publicServiceIdFilter\n"
+ " AND PSR.PSR_CreateDate BETWEEN :dateRangeMinFilter AND :dateRangeMaxFilter\n"
+ " AND PSR.PSR_Amount BETWEEN :amountRangeMinFilter AND :amountRangeMaxFilter\n"
+ " order by PSR.PSR_CreateDate desc";
@Query(nativeQuery = true, value = FIND_PUBLIC_SERVICES_BY_ARGS)
Map<String, Object> findPublicServiceReceiptsByParams(@Param("accountNumberFilter") String accountNumberFilter,
@Param("amountRangeMinFilter") String amountRangeMinFilter,
@Param("amountRangeMaxFilter") String amountRangeMaxFilter,
@Param("dateRangeMinFilter") String dateRangeMinFilter,
@Param("dateRangeMaxFilter") String dateRangeMaxFilter,
@Param("publicServiceIdFilter") String publicServiceIdFilter);
}
Мое рассуждение состояло в том, что, если параметр был нулевым, это означало, что тот, кто использовал Web-сервис, не заинтересован в этом параметре, поэтому, если это произойдет, я задаю эту переменную в качестве имени столбца, чтобы она не влияла в предложении WHERE и в теория упростила его, но я обнаружил, что он будет посылать имена в виде строк, так что он не будет распознаваться как выражение sql, что является недостатком моего мышления, и, как я сказал, должен быть другой способ, кроме написания каждого метода для каждой комбинации, я ценю любую помощь:).