오류 및 문제점
1. String을 Timestamp로 변경
- 문제점: yyyy-MM-dd 형식의 문자열을 Timestamp로 변경하고자 한다.
- 해결 방안: SimpleDateFormat을 이용해 Date로 만든 후 getTime()을 이용한다.
SimpleDateFormat pattern = new SimpleDateFormat("yyyy-MM-dd");
Timestamp time = null;
try {
Date date = pattern.parse(string);
time = new Timestamp(date.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return time;
2. MySQL null 처리
- 문제점: 쿼리를 실행할 때 모든 값이 필요해 outer join을 사용하지만 where절에서 null값이 걸러진다.
- 해결 방안: IFNULL() 메서드를 이용해 null 값을 채워준다.
WHERE IFNULL(end_date, SYSDATE()) <= DATE_ADD(SYSDATE(), INTERVAL 0 MONTH)
3. MySQL 조건문
- 문제점: select문에서 사용할 조건을 다르게 주고자 한다.
- 해결 방안: if 조건문을 이용해 각각의 상황에 대해 조건을 준다.
WHERE IFNULL(order_status, '') LIKE if(0 > 0, '출고완료', '%')
진행 상황
1. 3PL 남은 창고 자리 조회
public List<WarehouseDTO> findLeftLocation(Long threePLNo) {
List<WarehouseDTO> warehouseDTOs = new ArrayList<>();
List<Warehouse> warehouses = warehouseRepository.findByWarehouseNotInMatching(threePLNo);
for(Warehouse warehouse : warehouses) {
WarehouseDTO warehouseDTO = WarehouseDTO.builder()
.location(warehouse.getLocation())
.build();
warehouseDTOs.add(warehouseDTO);
}
return warehouseDTOs;
}
2. 화주사와 계약
- 트리거
- 계약시 3PL 계약한 화주사수 + 1
- 계약 종료시 매칭 히스토리에 insert, 3PL 계약한 화주사수 - 1
DELIMITER
CREATE TRIGGER trigger_matching_inserted
AFTER INSERT ON matching
FOR EACH ROW
BEGIN
UPDATE threepl SET cnt_contracted = cnt_contracted + 1
WHERE threepl_no = (SELECT threepl_no FROM warehouse
WHERE warehouse_no = NEW.warehouse_no);
END
DELIMITER ;
DELIMITER
CREATE TRIGGER trigger_history_matching_deleted
AFTER DELETE ON matching
FOR EACH ROW
BEGIN
INSERT INTO matching_history(history_matching_no, updated_date, updated_type, matching_no, seller_no, end_date, warehouse_no)
VALUES(seq_nextval('seq_history'), CURRENT_TIMESTAMP(), 'DELETED', OLD.matching_no, OLD.seller_no, OLD.end_date, OLD.warehouse_no);
UPDATE threepl SET cnt_contracted = cnt_contracted - 1
WHERE threepl_no = (SELECT threepl_no FROM warehouse
WHERE warehouse_no = OLD.warehouse_no);
END
DELIMITER ;
public boolean contract(MatchingDTO matchingDTO) {
Seller seller = sellerService.findById(matchingDTO.getSellerNo());
Warehouse warehouse = warehouseService.findByLocation(matchingDTO.getLocation(), matchingDTO.getThreePLNo());
if(warehouse == null) return false;
Matching matching = Matching
.builder()
.endDate(TimestampUtil.convertStringToTimestamp(matchingDTO.getEndDate()))
.seller(seller)
.warehouse(warehouse)
.build();
Matching savedMatching = matchingRepository.save(matching);
return savedMatching != null;
}
3. 조건에 맞는 화주사 검색 진행중
- SQL로는 결과가 잘 나오나 SpringBoot에서는 빈 리스트가 조회되는 상황
@Query(value = "SELECT seller.seller_no, company_name, group_name, end_date "
+ "FROM seller "
+ " JOIN product_group "
+ " ON seller.product_group_no = product_group.product_group_no "
+ " LEFT OUTER JOIN matching "
+ " ON seller.seller_no = matching.seller_no "
+ "WHERE seller.seller_no IN (SELECT seller.seller_no "
+ " FROM exports "
+ " JOIN export_product "
+ " ON exports.export_no = export_product.export_no "
+ " RIGHT OUTER JOIN seller "
+ " ON exports.seller_seller_no = seller.seller_no "
+ " WHERE IFNULL(order_status, '') LIKE if(:exportCnt > 0, '출고완료', '%') "
+ " GROUP BY seller.seller_no "
+ " HAVING COUNT(*) >= :exportCnt) "
+ "AND product_group.group_name LIKE '%:groupName%' "
+ "AND seller.address LIKE '%:address%' "
+ "AND IFNULL(end_date, SYSDATE()) <= DATE_ADD(SYSDATE(), INTERVAL :contractPeriod MONTH)", nativeQuery = true)
public List<Seller> findByMatchingCondition(@Param("groupName")String groupName, @Param("address")String address,
@Param("exportCnt")int exportCnt, @Param("contractPeriod")int contractPeriod);
참고 자료