728x90
안녕하세요 유저인사이트 박준호 선임입니다.
상품들의 별도의 정렬 기준이 있는 상태에서, 재고가 0 인 상품은 하단에 몰리도록 처리하는 부분에 문제가 생겼습니다.
final JPQLQuery<Product> query = from(product).where(builder).orderBy(product.stock.eq(0).asc())
.leftJoin(plant).on(product.plant.eq(plant))
.leftJoin(pot).on(product.pot.eq(pot))
.groupBy(product.pot.potGroup, product.plant.plantGroup);
<AST>:7:24: unexpected AST node: =
혹시나 문법 오류가 있는지 확인하기 위해 Sql로 테스트 해봤는데, 문제가 없었습니다.
SELECT * FROM product p
ORDER BY p.deliveryPrice = 0 ASC
문제의 원인은 Orderby 내부의 조건문 결과는 참 또는 거짓으로 딱 떨어져야만 해야하고, 제가 넣은 조건문은 그렇지 않아서 였습니다.
해결 방법은 CaseBuilder를 사용하여 해당 조건문이 참 또는 거짓만을 출력하게 작성한 후 해당 NumberExpression을 Orderby 구문에 넣어주면 됩니다.
NumberExpression<Integer> test = new CaseBuilder().when(product.stock.eq(0)).then(1).otherwise(0);
final JPQLQuery<Product> query = from(product).where(builder).orderBy(test.asc())
.leftJoin(plant).on(product.plant.eq(plant))
.leftJoin(pot).on(product.pot.eq(pot))
.groupBy(product.pot.potGroup, product.plant.plantGroup);
NumberExpression<Integer> test = new CaseBuilder().when(`조건문`).then(1).otherwise(0);
단순히 생각하면 위의 `조건문` 자리에 Orderby에 사용하고 싶은 조건문을 넣고 사용하면 됩니다.
박준호 / 선임연구원
Junho Park / 서비스R&D팀
728x90
'Spring Boot' 카테고리의 다른 글
IntelliJ에 SonarQube 연동하기 (SonarLint) (0) | 2023.09.22 |
---|---|
랜덤한 IV(Initial Vector)를 사용하여 AES256 암호화, 복호화 하기 (0) | 2023.09.18 |
MariaDB Trigger 추가할 때 SQL syntax 에러 해결 (0) | 2023.04.28 |
[Java] 모두 null 인지, null이 하나라도 존재하는 지 체크 (ObjectUtils) (0) | 2022.11.04 |
[JPA] Entity Column에 Map 사용하기 (0) | 2022.10.06 |