본문 바로가기

Spring Boot

Querydsl 에서 Order By 구문에 조건문이 있을 시 생기는 오류 처리 (unexpected AST node)

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팀

 

 

junho@userinsight.co.kr

728x90