기본적으로JPAQueryFactory, Projections, ExpressionUtils 클래스는 자주 사용하기 때문에 뭔지 공부할 필요성이 있다고 생각한다. (따로 정리 중📒)
동적쿼리
@Override public List<Academy> findDynamicQueryAdvance(String name, String address, String phoneNumber) { return queryFactory .selectFrom(academy) .where(eqName(name), eqAddress(address), eqPhoneNumber(phoneNumber)) .fetch(); } private BooleanExpression eqName(String name) { if (StringUtils.isEmpty(name)) { return null; } return academy.name.eq(name); } private BooleanExpression eqAddress(String address) { if (StringUtils.isEmpty(address)) { return null; } return academy.address.eq(address); } private BooleanExpression eqPhoneNumber(String phoneNumber) { if (StringUtils.isEmpty(phoneNumber)) { return null; } return academy.phoneNumber.eq(phoneNumber); }
- 값이 안들어올 때는 BooleanExpression에서 null을 반환함으로써 where 조건문에서 제외됨
- BooleanExpression은 where 안에서
,
로and
가 적용됨
Coalesce
NULL인 경우 다른 값으로 채우기
qCampaignEntity.startTime.coalesce(criteriaDate).asDate()
- 모든 argument가 null이면 null을 반환하고 아니면 첫번째 non-null argument를 반환함
group By
- List<객체> 로 groupby 해서 객체를 가져오는 방법이 있어요 이경우 의도한 객체의 생성자에 QueryProjectiont을 넣어 불러온 데이터를 통해 바로 list의 원소로 넣는거죠! (jdbc처럼)
- 저 Map을 사용한 저 방식을 활용한 이유는 저는 날짜와 amount만 필요해서, 저런식으로 했습니다.
Map<Integer, List<Comment>> results = query.from(post, comment) .where(comment.post.id.eq(post.id)) .transform(groupBy(post.id).as(list(comment)));
메모리 상에서 groupBy를 안하려면 첫번째 방법을 활용하면 됩니다.윌리엄이 말씀하신것까진 고려해서 안짜긴 했는데, 큰문제 없다고 판단했지만...
추후 문제 생기면 윌리엄이 말씀하신 것고려해서 첫번째 방법을 사용해야할 것같군요!