간단한 조건 검색 (필터링, 상세검색) 기능 만들기 (Kotlin, QueryDSL)
·
📦 Database/QueryDSL
검색 기능 만들기 QueryDSL의 Boolean Builder와 OrderSpecifier를 활용한 검색기능을 만들어 보았습니다. 요구사항 필터링: 와인 종류, 알코올 도수 범위, 와인의 가격 범위, 와인의 스타일, 와인의 등급, 지역 정렬: 와인 이름, 알코올 도수, 산도, 바디감, 단맛, 타닌, 와인의 점수, 와인의 가격 검색: 와인 이름 class CustomWineRepositoryImpl( @Autowired private val queryFactory: JPAQueryFactory ) : QuerydslRepositorySupport(Wine::class.java), CustomWineRepository { override fun findSingleWineByCondition(filter: ..
Query Builder - SubQuery Join - eq & goe
·
📦 Database/QueryDSL
SubQuery Join com.querydsl.jpa.JPAExpressions을 사용합니다. Subquery Join은 하위 쿼리를 사용하여 조인을 수행하는 방식입니다. Subquery Join을 사용하면 메인 쿼리와 서브쿼리 사이에 조인을 수행할 수 있습니다. 이를 통해 복잡한 조인 조건이나 필터링 작업을 수행할 수 있습니다. eq() /** @desc SubQuery Join - eq 사용 */ @Test fun subQueryJoin() { val m = QMember.member val sub = QMember("sub") val result = queryFactory .selectFrom(m) .where(m.age.eq(JPAExpressions .select(sub.age.max()) ...
Query Builder - Inner & Outer & Cross Join
·
📦 Database/QueryDSL
기본 Join 문법 조인의 기본 문법은 첫번째 파라미터에 조인 대상을 지정하고, 두번째 파라미터에 별칭(alias)으로 사용할 Q-Type을 지정하면 됩니다. join(조인대상, 조인 대상 테이블(Q-Type Entity)) join(), innerJoin() : 내부 조인 leftJoin() : left 외부 조인 (left outer join) rightJoin() : right 외부 조인 (right outer join) JPQL의 On과 성능 최적화를 위한 fetch join 제공 Inner Join Hibernate 5.1 부터 On을 사용해 서로 연관관계가 없는 필드로 외부조인 하는 기능이 추가되었습니다. 물론 내부 조인도 가능합니다. 주의할 점은 leftJoin() 부분에는 일반 조인과 다르..
Query Builder - Aggregation & Group By & Having
·
📦 Database/QueryDSL
집합 함수 JPQL이 제공하는 모든 집합 함수를 제공합니다. /** * COUNT(m) - 회원 수 * SUM(m.age) - 나이 합 * AVG(m.age) - 평균 나이 * MAX(m.age) - 최대 나이 * MIN(m.age) - 최소 나이 * @desc 집합 함수 */ @Test fun aggregation() { val m: QMember = QMember.member val result: MutableList? = queryFactory .select( m.count(), m.age.sum(), m.age.avg(), m.age.max(), m.age.min() ) .from(m) .fetch() val tuple = result?.get(0) assertThat(tuple?.get(m.co..
Query Builder - Sort, Paging
·
📦 Database/QueryDSL
💡 Sort desc(), asc() : 일반 정렬 nullsLast(), nullsFirst() : null 데이터에 순서 부여 /** * 회원 정렬 순서 * 1. 회원 나이 내림차순 (desc) * 2. 회원 이름 올림차순 (asc) * 단 2에서 회원 이름이 없으면 마지막에 출력 (nulls test) * */ @Test fun sort() { val m: QMember = QMember.member em.persist(Member(null, 100)) em.persist(Member("member5", 100)) em.persist(Member("member6", 100)) val result = queryFactory .selectFrom(m) .where(m.age.eq(100)) .order..