쿼리문이랑 똑같이 작성하는데 형식이 따로 있다.
public List<PcStatRentVo4> selectMcList(PcStatRentVo4 searchVo) throws InplabRuntimeException, ParseException {
String searchKeywordFrom = searchVo.getSearchKeywordFrom(); // 작성일자(From)
String searchKeywordTo = searchVo.getSearchKeywordTo(); // 작성일자(To)
StringBuilder query = new StringBuilder();
해당테이블을 직접 입력해줘서 테이블안에있는 어떤 칼럼을 쓰는지 적어준다.
CriteriaBuilder<TbPotMchn> cb = cbf.create(em, TbPotMchn.class)
.from(TbPotMchn.class,"a")
.leftJoinOn(TbPotMachineMaster.class, "b").on("a.mchnCd").eqExpression("b.amdNo").end();
조인을 할땐 조인할 테이블명을 적고, 조인 조건을 on과 eq 에 적어준다. 여기서 Expression 은 쿼리문을 그대로 적어주는 역할을 한다.
여기서 농기계의 동력기/ 작업기/ 농기계그룹을 그룹바이해줘서 하나의 그룹으로 묶어준다.
cb.groupBy("b.amdNm");
cb.groupBy("b.workNm");
cb.groupBy("a.mchnGrpNm");
해당하는 날짜를 찾고 싶을때 날짜를 선택하게 되면, 해당날짜로 이동하게 된다.
if (StringUtils.isNotBlank(searchKeywordFrom) && StringUtils.isNotBlank(searchKeywordTo)) {
cb.whereExpression("DATE(frstRgsrDttm) BETWEEN '" + searchKeywordFrom + "' AND '" + searchKeywordTo + "'"); // 날짜(파라미터포멧) 조회 조건 처리
}
selectDt 를 선택하면 0과 1, 2 를 선택하면 년도와 월 일을 차례로 보여줄 수 있다.
Long selectDt = searchVo.getSelectDt();
if (selectDt == 0L) {
cb.groupBy("YEAR(a.frstRgsrDttm)");
}else if(selectDt == 1L ) {
cb.groupBy("YEAR(a.frstRgsrDttm)");
cb.groupBy("MONTH(a.frstRgsrDttm)");
}else if (selectDt == 2L) {
cb.groupBy("YEAR(a.frstRgsrDttm)");
cb.groupBy("MONTH(a.frstRgsrDttm)");
cb.groupBy("DAYOFMONTH(a.frstRgsrDttm)");
}
이부분에 쿼리문의 select 문을 적어준다.
// 결과를 써준다.
CriteriaBuilder<PcStatRentVo4> bindedCb = cb.selectNew(
new ObjectBuilder<PcStatRentVo4>() {
@Override
public <X extends SelectBuilder<X>> void applySelects(X selectBuilder) {
Long selectDt = searchVo.getSelectDt();
if(selectDt == 0L ) {
selectBuilder.select("CONCAT(YEAR(a.frstRgsrDttm), '')");
}else if (selectDt == 1L) {
selectBuilder.select("CONCAT(YEAR(a.frstRgsrDttm), '-', LPAD(MONTH(a.frstRgsrDttm), 2, '0'))");
}else if (selectDt == 2L) {
selectBuilder.select("CONCAT(YEAR(a.frstRgsrDttm), '-' ,LPAD(MONTH(a.frstRgsrDttm),2, '0'), '-', LPAD(DAYOFMONTH(a.frstRgsrDttm), 2, '0'))");
}
selectBuilder
.select("b.amdNm")
.select("b.workNm")
.select("a.mchnGrpNm")
.select("SUM(a.purchsAmt)")
.select("COUNT(*)");
}
이부분에는 select 한 순서와 맞게 프론트쪽이랑 연결시켜준다. Vo를 사용한다.
@Override
public PcStatRentVo4 build(Object[] tuple) {
return PcStatRentVo4.builder()
.year((String) tuple[0])
.mov_mac((String) tuple[1])
.work_mac((String) tuple[2])
.noung_group((String) tuple[3])
.total_price((BigDecimal) tuple[4])
.total_count((Long) tuple[5])
.build();
}
@Override
public List<PcStatRentVo4> buildList(List<PcStatRentVo4> list) {
return list;
}
});
return bindedCb.getResultList();
}
이렇게 하면 프론트쪽이랑 연결이 가능해진다.
'전자정부프레임워크' 카테고리의 다른 글
프론트에서 보내준 값을 쿼리문에 대입하기 (0) | 2024.08.19 |
---|