상세 컨텐츠

본문 제목

냉집사 Query Dsl 정리

기술정리

by 승학이 2024. 2. 9. 16:20

본문

장바구니 식품 찾기

장바구니 식품 찾기

  • fetch()

리스트 조회, 데이터 없으면 빈 리스트 반환(null 아니다)

  • eq(같은지 비교)

**eq**는 JPAQueryDSL에서 사용되는 조건식입니다. 이 조건식은 동등 비교(equality comparison)를 나타냅니다.

**cartFood.cart.cartIdx.eq(cartIdx)**는 cartFood 엔티티의 cart 속성에서 cartIdx 필드를 가져와 **cartIdx**와 동일한 값을 가지는지 확인하는 것을 의미합니다. 즉, cartFood 엔티티의 cart 속성의 **cartIdx**와 cartIdx 변수의 값이 같은지를 비교합니다.

eq 메서드는 일반적으로 JPAQueryDSL에서 사용되는 다양한 조건문에서 동등 비교를 수행하기 위해 쓰입니다.

  • in(배열중 같은지 비교)

**.in()**은 JPAQueryDSL에서 사용되는 조건식 중 하나입니다. 이 조건식은 주어진 컬렉션 또는 배열 내의 값 중 하나와 일치하는지 여부를 확인합니다.

**cartFood.food.foodIdx.in(foodIdxes)**는 cartFood 엔티티의 food 속성에서 foodIdx 필드를 가져와서 foodIdxes 리스트에 포함된 값 중 하나와 일치하는지 확인하는 것을 의미합니다. 즉, cartFood 엔티티의 food 속성의 **foodIdx**가 foodIdxes 리스트 내에 포함된 값 중 하나와 일치해야 조건을 만족합니다.

**.in()**은 여러 개의 값을 비교하고자 할 때 사용됩니다. 주어진 값들 중 하나와 일치하면 조건을 만족시킬 수 있습니다.

 

관리자 닉네임 찾기(검색)

 

동적 쿼리

  • offset(페이지 크기설정)

**.offset(pageable.getOffset())**는 Spring Data JPA에서 사용되는 Pageable 인터페이스를 통해 페이지네이션을 구현할 때 사용되는 메서드입니다.

**Pageable**은 페이지의 크기(page size)와 현재 페이지의 오프셋(offset)을 나타내는 정보를 포함합니다. getOffset() 메서드는 현재 페이지의 시작 오프셋을 반환합니다.

**.offset(pageable.getOffset())**는 쿼리 결과에서 가져올 레코드의 시작 위치를 설정하는데 사용됩니다. 이를 통해 지정된 페이지의 첫 번째 레코드를 가져올 수 있습니다. 일반적으로 페이지의 크기와 오프셋을 기반으로 데이터베이스 쿼리의 LIMIT 및 OFFSET 절을 설정하여 페이지네이션을 처리합니다.

예를 들어, 페이지 크기가 10이고 현재 페이지가 2일 경우, **pageable.getOffset()**은 10을 반환하며, **.offset(pageable.getOffset())**는 데이터베이스 쿼리에서 10번째 레코드부터 결과를 가져오도록 지정합니다.

따라서 **.offset(pageable.getOffset())**는 지정된 페이지의 첫 번째 레코드를 가져오기 위해 오프셋을 설정하는 역할을 합니다.

 

  • where(조건)

.where() 절은 쿼리에서 조건을 설정하는 부분입니다. .where() 메서드 안에 있는 조건들은 해당 쿼리에서 가져올 레코드를 필터링하는데 사용됩니다.

**.where(nicknameLike(nickname), user.isEnable.eq(active))**는 두 개의 조건을 설정하고 있습니다:

  1. nicknameLike(nickname): 이 조건은 nickname 필드가 주어진 **nickname**과 유사한 값을 가지는지 확인합니다. **nicknameLike()**는 문자열 비교를 수행하는 메서드로, 일치하거나 유사한 값과 매칭될 수 있습니다. 실제로 nicknameLike() 메서드는 어떻게 구현되었는지에 따라 검색 패턴이 달라질 수 있습니다. 예를 들어, 대소문자를 무시하거나 와일드카드 문자를 사용할 수도 있습니다.
  2. user.isEnable.eq(active): 이 조건은 isEnable 필드가 주어진 active 값과 일치하는지 확인합니다. **user.isEnable.eq(active)**는 user 객체의 isEnable 필드와 active 값이 동일한지를 비교합니다. **eq()**는 동등 비교를 수행하는 메서드입니다.

이러한 조건들은 쿼리 결과에 적용되어 필터링된 결과를 반환합니다. 즉, nickname과 active 값에 해당하는 레코드만 쿼리 결과로 반환됩니다.

 

  • limit(페이지 개수 제한)

**.limit(pageable.getPageSize())**는 Spring Data JPA에서 사용되는 Pageable 인터페이스를 통해 페이지네이션을 구현할 때 사용되는 메서드입니다.

**Pageable**은 페이지의 크기(page size)와 현재 페이지의 오프셋(offset)을 나타내는 정보를 포함합니다. getPageSize() 메서드는 페이지의 크기를 반환합니다.

**.limit(pageable.getPageSize())**는 쿼리 결과에서 가져올 레코드의 최대 개수를 제한하는데 사용됩니다. 이를 통해 한 페이지에서 반환되는 결과의 개수를 지정할 수 있습니다. 일반적으로 데이터베이스 쿼리의 LIMIT 절을 설정하여 페이지네이션을 처리합니다.

예를 들어, 페이지 크기가 10일 경우, **.limit(pageable.getPageSize())**는 데이터베이스 쿼리에서 최대 10개의 레코드를 가져오도록 지정합니다.

따라서 .limit(pageable.getPageSize())는 페이지의 크기를 기반으로 결과 레코드의 개수를 제한하는 역할을 합니다. 이를 통해 한 페이지에 표시될 항목의 개수를 제어할 수 있습니다.

 

  • orderBy(정렬)

**.orderBy(user.userIdx.desc())**는 쿼리 결과를 정렬하는데 사용되는 부분입니다. 이 부분은 user 테이블의 userIdx 열을 기준으로 내림차순으로 정렬합니다.

.orderBy() 메서드는 정렬 순서를 지정하는 데 사용되며, **user.userIdx.desc()**는 userIdx 열을 기준으로 내림차순으로 정렬하겠다는 것을 의미합니다. 내림차순 정렬은 가장 큰 값부터 가장 작은 값까지 정렬하는 것을 의미합니다.

이렇게 정렬을 설정함으로써 결과 집합이 userIdx 열을 기준으로 내림차순으로 정렬되어 반환됩니다.

 

 

냉집사 통계(낭비/소비)

  • fetchOne

**.fetchOne()**은 QueryDSL에서 사용되는 메서드로, 쿼리 결과에서 단일 값을 반환하는 역할을 합니다.

 

 

냉장고 음식 폐기

  • select(쿼리 선택)

**return jpaQueryFactory.select(new QFridgeDiscardRes(fridgeFood.food.foodCategory, fridgeFood.food.foodImgKey))**는 QueryDSL을 사용하여 쿼리 결과를 선택하는 부분입니다.

jpaQueryFactory.select() 메서드는 쿼리 결과로 선택할 열이나 표현식을 지정하는 데 사용됩니다. **new QFridgeDiscardRes(fridgeFood.food.foodCategory, fridgeFood.food.foodImgKey)**는 **QFridgeDiscardRes**라는 QueryDSL 클래스의 인스턴스를 생성하고, 해당 클래스의 생성자에 **fridgeFood.food.foodCategory**와 **fridgeFood.food.foodImgKey**를 전달하여 선택할 열을 지정합니다.

**QFridgeDiscardRes**는 QueryDSL에서 사용자 정의로 생성한 클래스일 수 있으며, 쿼리 결과를 매핑하기 위해 사용될 수 있습니다. 이 클래스는 쿼리 결과로 선택한 열에 해당하는 필드를 가지고 있을 것입니다.

위의 코드에서 **jpaQueryFactory.select(new QFridgeDiscardRes(fridgeFood.food.foodCategory, fridgeFood.food.foodImgKey))**는 다음과 같이 동작합니다:

  1. QFridgeDiscardRes 클래스의 인스턴스를 생성합니다.
  2. 생성자에 **fridgeFood.food.foodCategory**와 **fridgeFood.food.foodImgKey**를 전달하여 열을 선택합니다.
  3. jpaQueryFactory.select() 메서드는 지정된 열을 쿼리 결과로 선택합니다.

즉, 해당 코드는 fridgeFood 테이블에서 foodCategory와 foodImgKey 열을 선택하여 쿼리 결과로 반환하도록 설정합니다.

 

  • groupBy

(GROUP BY로 집계된 결과 중 원하는 값을 조회하기 위해 HAVING절을 통해 조건절을 추가할 수 있다.)

**.groupBy(fridgeFood.food.foodCategory)**는 쿼리 결과를 그룹화하는데 사용되는 부분입니다. 이 구문은 fridgeFood 테이블의 foodCategory 열을 기준으로 결과를 그룹화합니다.

.groupBy() 메서드는 쿼리 결과를 지정된 열 또는 표현식을 기준으로 그룹화합니다. 그룹화된 결과는 공통된 값에 따라 여러 개의 그룹으로 나누어집니다.

위의 코드에서 **.groupBy(fridgeFood.food.foodCategory)**는 다음과 같이 동작합니다:

  1. 쿼리 결과가 foodCategory 열 값을 기준으로 그룹화됩니다.
  2. 그룹화된 결과는 foodCategory 열의 고유한 값들을 기준으로 여러 개의 그룹으로 나누어집니다.

그룹화는 일반적으로 집계 함수와 함께 사용되며, 각 그룹에 대한 집계 결과를 계산할 수 있습니다. 그룹화된 결과를 기반으로 통계 정보를 생성하거나 그룹 내에서 가장 큰/작은 값을 찾는 등 다양한 분석 작업을 수행할 수 있습니다.

  • having

(HAVING 절과 WHERE 절의 다른 점은 HAVING 절은 GROUP BY 절과 함께 사용해야 하며 집계 함수를 사용하여 조건절을 작성하거나 GROUP BY 컬럼만 조건절에 사용할 수 있다.)

**.having(fridgeFood.food.foodCategory.count().goe(1L))**는 그룹화된 결과에 대한 필터링 조건을 설정하는 부분입니다. 이 구문은 그룹화된 결과 중에서 foodCategory 열의 개수(count)가 1 이상인 그룹만 선택합니다.

.having() 메서드는 그룹화된 결과에 대한 필터링을 수행하는데 사용됩니다. 쿼리 결과를 그룹화한 후, .having() 메서드 내의 조건을 만족하는 그룹만을 선택하여 반환합니다.

위의 코드에서 **.having(fridgeFood.food.foodCategory.count().goe(1L))**는 다음과 같이 동작합니다:

  1. 쿼리 결과가 foodCategory 열을 기준으로 그룹화되었습니다.
  2. .having() 메서드는 그룹화된 결과 중에서 조건을 만족하는 그룹을 선택합니다.
  3. fridgeFood.food.foodCategory.count().goe(1L) 조건은 foodCategory 열의 개수(count)가 1 이상인 그룹을 선택합니다. **goe()**는 "이상"을 의미하는 Greater Than or Equal의 약자로, 개수가 1 이상인 그룹을 필터링합니다.

따라서 **.having(fridgeFood.food.foodCategory.count().goe(1L))**는 개수가 1 이상인 foodCategory 그룹만을 선택하여 반환합니다.

 

  • fetchFirst(쿼리 결과에서 첫 번째 값을 반환)

**.fetchFirst()**는 QueryDSL에서 사용되는 메서드로, 쿼리 결과에서 첫 번째 값을 반환하는 역할을 합니다.

.fetchFirst() 메서드는 쿼리 결과에서 첫 번째 값을 반환합니다. 쿼리 결과가 여러 개의 레코드를 반환하는 경우에도 **.fetchFirst()**는 첫 번째 레코드를 반환합니다.

위의 코드에서 **.fetchFirst()**는 다음과 같이 동작합니다:

  1. 쿼리가 실행되고 결과 레코드가 반환됩니다.
  2. **.fetchFirst()**는 쿼리 결과에서 첫 번째 레코드를 가져와 반환합니다.

.fetchFirst() 메서드는 첫 번째 값을 가져올 때 주로 사용됩니다. 위의 코드에서는 그룹화된 결과 중에서 첫 번째 값을 반환하도록 **.fetchFirst()**가 사용되었습니다.

 

  • limit

**.limit(1)**은 QueryDSL에서 사용되는 메서드로, 쿼리 결과의 반환 개수를 제한하는 역할을 합니다.

.limit() 메서드는 쿼리 결과의 반환 개수를 제한하는데 사용됩니다. 인자로 반환할 최대 개수를 전달합니다.

위의 코드에서 **.limit(1)**은 다음과 같이 동작합니다:

  1. 이전 조건 및 연산에 의해 선택된 쿼리 결과의 개수를 제한합니다.
  2. **1**을 인자로 전달하여 최대 1개의 결과만을 반환하도록 설정합니다.

즉, **.limit(1)**은 쿼리 결과를 최대 1개의 결과만 반환하도록 제한하는 역할을 합니다. 이를 통해 쿼리 결과를 한 개의 결과로 제한하여 반환합니다.

 

 

사용자가 속한 가정용/공용 냉장고 food list

  • leftJoin

**.leftJoin(fridgeFood).on(food.eq(fridgeFood.food))**는 조인 연산을 수행하는 부분입니다. 이 구문은 food 테이블과 fridgeFood 테이블을 조인하고, food 열과 fridgeFood.food 열 간의 조인 조건을 설정합니다.

.leftJoin() 메서드는 조인 연산을 수행하는데 사용됩니다. 첫 번째 인자로 조인할 테이블을 지정하고, .on() 메서드를 사용하여 조인 조건을 설정합니다.

위의 코드에서 **.leftJoin(fridgeFood).on(food.eq(fridgeFood.food))**는 다음과 같이 동작합니다:

  1. fridgeFood 테이블과 food 테이블을 조인합니다.
  2. food.eq(fridgeFood.food) 조건을 설정하여 food 열과 fridgeFood.food 열 간의 조인 조건을 정의합니다. 이 조건은 food 테이블의 food 열과 fridgeFood 테이블의 food 열이 같은 값을 가져야 함을 의미합니다.

즉, **.leftJoin(fridgeFood).on(food.eq(fridgeFood.food))**는 food 테이블과 fridgeFood 테이블을 조인하고, food 열과 fridgeFood.food 열 간의 값이 일치하는 레코드들을 반환합니다. 이를 통해 food 테이블과 fridgeFood 테이블 간의 관계를 활용하여 쿼리를 수행합니다.

 

  • selectFrom

**selectFrom(food)**는 QueryDSL에서 사용되는 메서드로, 쿼리의 SELECT 절에서 어떤 테이블이나 엔티티를 대상으로 데이터를 선택할지를 지정하는 역할을 합니다.

selectFrom() 메서드는 쿼리의 SELECT 절에서 데이터를 선택하기 위해 사용됩니다. 첫 번째 인자로 선택할 테이블이나 엔티티를 전달합니다.

위의 코드에서 **selectFrom(food)**는 다음과 같이 동작합니다:

  1. **food**를 SELECT 절의 대상으로 선택합니다. 여기서 **food**는 테이블이나 엔티티를 나타냅니다.
  2. 쿼리 결과는 food 테이블 또는 food 엔티티에서 선택된 데이터로 구성됩니다.

따라서 **selectFrom(food)**는 food 테이블 또는 엔티티에서 데이터를 선택하여 쿼리 결과로 반환하도록 설정합니다. 이를 통해 쿼리 결과에 **food**에 대한 정보가 포함됩니다.

 

 

냉장고 주인 권한삭제

  • update

**update(fridgeFood)**는 QueryDSL에서 사용되는 메서드로, 업데이트 연산을 수행하기 위해 특정 테이블이나 엔티티를 대상으로 지정하는 역할을 합니다.

update() 메서드는 쿼리에서 업데이트 연산을 수행하기 위해 사용됩니다. 첫 번째 인자로 업데이트할 테이블이나 엔티티를 전달합니다.

위의 코드에서 **update(fridgeFood)**는 다음과 같이 동작합니다:

  1. **fridgeFood**를 업데이트 연산의 대상으로 지정합니다. 여기서 **fridgeFood**는 테이블이나 엔티티를 나타냅니다.
  2. 이후에 **.setNull(fridgeFood.owner)**와 .where(fridgeFood.owner.eq(fridgeUser.getUser())) 등의 연산을 수행하여 해당 테이블 또는 엔티티의 데이터를 업데이트합니다.

즉, **update(fridgeFood)**는 fridgeFood 테이블 또는 엔티티에서 데이터를 업데이트하기 위한 연산을 수행합니다. 이를 통해 쿼리를 실행하여 **fridgeFood**의 owner 열을 업데이트할 수 있습니다.

 

  • setNull

**.setNull(fridgeFood.owner)**는 업데이트 연산에서 fridgeFood 테이블 또는 엔티티의 owner 열을 NULL로 설정하는 역할을 합니다.

.setNull() 메서드는 업데이트 연산에서 특정 열을 NULL로 설정하는데 사용됩니다. 첫 번째 인자로 NULL로 설정할 열을 전달합니다.

위의 코드에서 **.setNull(fridgeFood.owner)**는 다음과 같이 동작합니다:

  1. fridgeFood 테이블 또는 엔티티에서 owner 열을 NULL로 설정합니다.
  2. 이로 인해 해당 테이블 또는 엔티티의 owner 열에 NULL 값이 할당됩니다.

즉, **.setNull(fridgeFood.owner)**는 fridgeFood 테이블 또는 엔티티에서 owner 열의 값을 NULL로 업데이트하는 역할을 합니다. 이를 통해 **fridgeFood**의 owner 열을 삭제하거나 초기화할 수 있습니다.

 

  • excute(업데이트, 삭제 쿼리실행)

**.execute()**는 QueryDSL에서 사용되는 메서드로, 업데이트나 삭제와 같은 쿼리를 실행하는 역할을 합니다.

.execute() 메서드는 쿼리를 실행하여 데이터베이스에 영향을 주는 작업을 수행합니다. 쿼리가 실행되고나면 영향을 받은 행(row)의 개수를 반환합니다.

위의 코드에서 **.execute()**는 다음과 같이 동작합니다:

  1. .update() 또는 .delete() 등의 업데이트나 삭제 연산을 수행합니다.
  2. .execute() 메서드는 해당 쿼리를 실행하여 데이터베이스에 변경을 적용합니다.
  3. 실행된 쿼리에 의해 영향을 받은 행(row)의 개수를 반환합니다.

.execute() 메서드는 일반적으로 업데이트나 삭제 쿼리를 실행할 때 사용됩니다. 이를 통해 쿼리를 실행하고 결과로 영향을 받은 행의 개수를 확인할 수 있습니다.

 

인기 레시피 불러오기

  • distinct(중복결과 제거)

**.distinct()**는 QueryDSL에서 사용되는 메서드로, 중복된 결과를 제거하는 역할을 합니다.

.distinct() 메서드는 중복된 결과를 제거하여 유일한 결과만 반환합니다. 쿼리 결과에서 중복된 값이 있을 경우, **.distinct()**를 사용하여 중복을 제거합니다.

 

동적쿼리

  • hasText(비어있는지 아닌지 확인)

**hasText(nickname)**는 주어진 **nickname**이 비어있지 않은지 확인하는 메서드입니다. 비어있지 않은 경우에는 true를 반환하고, 비어있는 경우에는 false를 반환합니다.

'기술정리' 카테고리의 다른 글

깃액션 CI/CD  (0) 2024.02.09
NGINX  (0) 2024.02.09
데이터 접근 기술 - 테스트  (2) 2024.02.05
MyBatis  (0) 2024.02.02
Jdbc Template  (0) 2024.02.02

관련글 더보기