반응형
해당 글에서는 Spring Data JPA 중 javax.persistence.criteria 패키지 내에 포함되어 있는 CriteriaQuery 내의 메서드에 대해 확인합니다.
1) CriteriaQuery
💡 CriteriaQuery
- Java에서 제공하는 JPA(Java Persistence API)의 API 중 하나로, SQL 질의를 자바 객체로 표현하기 위해 사용됩니다. 이 API는 SQL 질의의 생성, 실행, 그리고 결과 처리를 도와줍니다.
- 메서드들은 주로 질의를 생성하고 조작하는 데 사용되며, 여기에는 abs, all, and, any, between, coalesce 등이 포함됩니다. 각 메서드는 특정 연산을 수행하며, 이를 통해 복잡한 질의를 생성할 수 있습니다.
2) CriteriaQuery Class Method
💡 CriteriaQuery Class Method
- 해당 분류 내용은 API를 확인하고 비슷한 내용에 대해 분류하였으니 참고하시면 될 것 같습니다.
메서드 반환값 분류 설명
메서드 | 반환 값 | 분류 | 설명 |
createQuery() | CriteriaQuery<Object> | 쿼리 생성 | CriteriaQuery 객체를 생성합니다. |
createQuery(Class<T> resultClass) | CriteriaQuery<T> | 쿼리 생성 | 지정된 결과 유형을 가진 CriteriaQuery 객체를 생성합니다. |
createTupleQuery() | CriteriaQuery<Tuple> | 쿼리 생성 | 결과로 객체 튜플을 반환하는 CriteriaQuery 객체를 생성합니다. |
createCriteriaDelete(Class<T> targetEntity) | CriteriaDelete<T> | 쿼리 생성 | 대량 삭제 작업을 수행하는 CriteriaDelete 쿼리 객체를 생성합니다. |
createCriteriaUpdate(Class<T> targetEntity) | CriteriaUpdate<T> | 쿼리 생성 | 대량 업데이트 작업을 수행하는 CriteriaUpdate 쿼리 객체를 생성합니다. |
concat(Expression<String> x, Expression<String> y) | Expression<String> | 문자열 연산 | 문자열 연결 표현식을 생성합니다. |
concat(Expression<String> x, String y) | Expression<String> | 문자열 연산 | 문자열 연결 표현식을 생성합니다. |
concat(String x, Expression<String> y) | Expression<String> | 문자열 연산 | 문자열 연결 표현식을 생성합니다. |
locate(Expression<String> x, Expression<String> pattern) | Expression<Integer> | 문자열 연산 | 한 문자열 내의 다른 문자열의 위치를 찾아 첫 번째 문자의 위치를 반환하는 표현식 생성 |
like(Expression<String> x, Expression<String> pattern) | Predicate | 문자열 연산 | 표현식이 주어진 패턴을 만족하는지 테스트하는 술어 생성 |
notLike(Expression<String> x, Expression<String> pattern) | Predicate | 문자열 연산 | 표현식이 주어진 패턴을 만족하지 않는지 테스트하는 술어 생성 |
substring(Expression<String> x, Expression<Integer> from) | Expression<String> | 문자열 연산 | 부분 문자열 추출 표현식 생성 |
lower(Expression<String> x) | Expression<String> | 문자열 연산 | 문자열을 소문자로 변환하는 표현식 생성 |
upper(Expression<String> x) | Expression<String> | 문자열 연산 | 문자열을 대문자로 변환하는 표현식 생성 |
length(Expression<String> x) | Expression<Integer> | 문자열 연산 | 문자열의 길이를 반환하는 표현식 생성 |
equal(Expression<?> x, Expression<?> y) | Predicate | 비교 연산 | 인수의 동등성을 테스트하는 술어를 생성합니다. |
equal(Expression<?> x, Object y) | Predicate | 비교 연산 | 인수의 동등성을 테스트하는 술어를 생성합니다. |
notEqual(Expression<?> x, Expression<?> y) | Predicate | 비교 연산 | 인수의 부등성을 테스트하는 술어 생성 |
between(Expression<? extends Y> v, Expression<? extends Y> x, Expression<? extends Y> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째와 세 번째 인수 사이의 값인지 테스트하는 술어를 생성합니다. |
between(Expression<? extends Y> v, Y x, Y y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째와 세 번째 인수 사이의 값인지 테스트하는 술어를 생성합니다. |
ge(Expression<? extends Number> x, Expression<? extends Number> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 크거나 같은지 테스트하는 술어를 생성합니다. |
ge(Expression<? extends Number> x, Number y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 크거나 같은지 테스트하는 술어를 생성합니다. |
ge(Expression<? extends Number> x, Expression<? extends Number> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 크거나 같은지 테스트하는 술어를 생성합니다. |
ge(Expression<? extends Number> x, Number y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 크거나 같은지 테스트하는 술어를 생성합니다. |
greaterThan(Expression<? extends Y> x, Expression<? extends Y> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 큰지 테스트하는 술어를 생성합니다. |
greaterThan(Expression<? extends Y> x, Y y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째보다 큰지 테스트하는 술어를 생성합니다. |
greaterThanOrEqualTo(Expression<? extends Y> x, Expression<? extends Y> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 크거나 같은지 테스트하는 술어를 생성합니다. |
greaterThanOrEqualTo(Expression<? extends Y> x, Y y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 크거나 같은지 테스트하는 술어 생성 |
gt(Expression<? extends Number> x, Expression<? extends Number> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 큰지 테스트하는 술어 생성 |
le(Expression<? extends Number> x, Expression<? extends Number> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 작거나 같은지 테스트하는 술어 생성 |
lessThan(Expression<? extends Y> x, Expression<? extends Y> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 작은지 테스트하는 술어 생성 |
lessThanOrEqualTo(Expression<? extends Y> x, Expression<? extends Y> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 작거나 같은지 테스트하는 술어 생성 |
lt(Expression<? extends Number> x, Expression<? extends Number> y) | Predicate | 비교 연산 | 첫 번째 인수가 두 번째 인수보다 작은지 테스트하는 술어 생성 |
in(Expression<? extends T> expression) | CriteriaBuilder.In<T> | 비교 연산 | 주어진 표현식이 값 목록에 포함되어 있는지 테스트하는 술어 생성 |
isEmpty(Expression<C> collection) | Predicate | 비교 연산 | 컬렉션이 비어 있는지 테스트하는 술어 생성 |
isFalse(Expression<Boolean> x) | Predicate | 비교 연산 | false 값을 테스트하는 술어 생성 |
isMember(E elem, Expression<C> collection) | Predicate | 비교 연산 | 요소가 컬렉션의 멤버인지 테스트하는 술어 생성 |
isNotNull(Expression<?> x) | Predicate | 비교 연산 | 표현식이 null이 아닌지 테스트하는 술어 생성 |
isNull(Expression<?> x) | Predicate | 비교 연산 | 표현식이 null인지 테스트하는 술어 생성 |
isTrue(Expression<Boolean> x) | Predicate | 비교 연산 | true 값을 테스트하는 술어 생성 |
coalesce() | CriteriaBuilder.Coalesce<T> | Null 처리 | coalesce 표현식을 생성합니다. |
coalesce(Expression<? extends Y> x, Expression<? extends Y> y) | Expression<Y> | Null 처리 | 모든 인수가 null로 평가되면 null을 반환하고, 첫 번째 비null 인수의 값을 반환하는 표현식을 생성합니다. |
coalesce(Expression<? extends Y> x, Y y) | Expression<Y> | Null 처리 | 모든 인수가 null로 평가되면 null을 반환하고, 첫 번째 비null 인수의 값을 반환하는 표현식을 생성합니다. |
nullif(Expression<Y> x, Expression<?> y) | Expression<Y> | Null 처리 | 인수가 같은지 테스트하는 표현식 생성. 같으면 null을 반환하고, 그렇지 않으면 첫 번째 표현식의 값을 반환 |
abs(Expression<N> x) | Expression<N> | 수식 연산 | 인수의 절댓값을 반환하는 표현식을 생성합니다. |
diff(Expression<? extends N> x, N y) | Expression<N> | 수식 연산 | 인수 간의 차이를 반환하는 표현식을 생성합니다. |
diff(Expression<? extends N> x, Expression<? extends N> y) | Expression<N> | 수식 연산 | 인수 간의 차이를 반환하는 표현식을 생성합니다. |
diff(N x, Expression<? extends N> y) | Expression<N> | 수식 연산 | 인수 간의 차이를 반환하는 표현식을 생성합니다. |
mod(Expression<Integer> x, Expression<Integer> y) | Expression<Integer> | 수식 연산 | 인수의 모듈러스를 반환하는 표현식 생성 |
neg(Expression<N> x) | Expression<N> | 수식 연산 | 인수의 산술적 부정을 반환하는 표현식 생성 |
sqrt(Expression<? extends Number> x) | Expression<Double> | 수식 연산 | 인수의 제곱근을 반환하는 표현식 생성 |
prod(Expression<? extends N> x, Expression<? extends N> y) | Expression<N> | 수식 연산 | 인수의 곱을 반환하는 표현식 생성 |
quot(Expression<? extends Number> x, Expression<? extends Number> y) | Expression<Number> | 수식 연산 | 인수의 몫을 반환하는 표현식 생성 |
literal(T value) | Expression<T> | 수식 연산 | 리터럴에 대한 표현식 생성 |
all(Subquery<Y> subquery) | Expression<Y> | 서브쿼리 | 서브쿼리 결과에 대한 all 표현식을 생성합니다. |
any(Subquery<Y> subquery) | Expression<Y> | 서브쿼리 | 서브쿼리 결과에 대한 any 표현식을 생성합니다. |
exists(Subquery<?> subquery) | Predicate | 서브쿼리 | 서브쿼리 결과의 존재를 테스트하는 술어를 생성합니다. |
some(Subquery<Y> subquery) | Expression<Y> | 서브쿼리 | 서브쿼리 결과에 대한 일부 표현식 생성 |
count(Expression<?> x) | Expression<Long> | 집계 함수 | count 연산을 적용한 집계 표현식을 생성합니다. |
greatest(Expression<X> x) | Expression<X> | 집계 함수 | 가장 큰 값(문자열, 날짜 등)을 찾는 집계 표현식 생성 |
avg(Expression<N> x) | Expression<Double> | 집계 함수 | avg 연산을 적용한 집계 표현식을 생성합니다. |
least(Expression<X> x) | Expression<X> | 집계 함수 | 가장 작은 값(문자열, 날짜 등)을 찾는 집계 표현식 생성 |
max(Expression<N> x) | Expression<N> | 집계 함수 | 수치 최대 작업을 적용하는 집계 표현식 생성 |
min(Expression<N> x) | Expression<N> | 집계 함수 | 수치 최소 작업을 적용하는 집계 표현식 생성 |
countDistinct(Expression<?> x) | Expression<Long> | 집계 함수 | count distinct 연산을 적용한 집계 표현식을 생성합니다. |
and(Expression<Boolean> x, Expression<Boolean> y) | Predicate | 논리 연산 | 주어진 부울 표현식의 교집합을 생성합니다. |
and(Predicate... restrictions) | Predicate | 논리 연산 | 주어진 제한 술어의 교집합을 생성합니다. |
disjunction() | Predicate | 논리 연산 | 분리(0개의 분리항)를 생성합니다. |
conjunction() | Predicate | 논리 연산 | 교집합(0개의 접속사)을 생성합니다. |
not(Expression<Boolean> restriction) | Predicate | 논리 연산 | 주어진 제한의 부정 생성 |
or(Expression<Boolean> x, Expression<Boolean> y) | Predicate | 논리 연산 | 주어진 불린 표현식의 분리 생성 |
currentDate() | Expression<Date> | 날짜 함수 | 현재 날짜를 반환하는 표현식을 생성합니다. |
currentTime() | Expression<Time> | 시간 함수 | 현재 시간을 반환하는 표현식을 생성합니다. |
currentTimestamp() | Expression<Timestamp> | 시간 함수 | 현재 타임스탬프를 반환하는 표현식을 생성합니다. |
asc(Expression<?> x) | Order | 정렬 | 표현식의 오름차순으로 정렬을 생성합니다. |
desc(Expression<?> x) | Order | 정렬 | 표현식의 내림차순으로 정렬을 생성합니다. |
function(String name, Class<T> type, Expression<?>... args) | Expression<T> | 함수 | 데이터베이스 함수의 실행에 대한 표현식을 생성합니다. |
parameter(Class<T> paramClass) | ParameterExpression<T> | 매개변수 | 매개변수 표현식 생성 |
selectCase() | CriteriaBuilder.Case<R> | 조건문 | 일반적인 경우 표현식 생성 |
keys(M map) | Expression<Set<K>> | 컬렉션 | 맵의 키를 반환하는 표현식 생성 |
size(C collection) | Expression<Integer> | 컬렉션 연산 | 컬렉션의 크기를 테스트하는 표현식 생성 |
construct(Class<Y> resultClass, Selection<?>... selections) | CompoundSelection<Y> | 선택 항목 | 생성자에 해당하는 선택 항목을 생성합니다. |
array(Selection<?>... selections) | CompoundSelection<Object[]> | 선택 항목 | 배열 값 선택 항목을 생성합니다. |
3) CriteriaQuery Method 사용예시
💡 CriteriaQuery Method 사용예시
1. CriteriaBuilder 인스턴스를 생성합니다.
2. UserEntity 타입의 CriteriaBuilder를 구성합니다.
3. 데이터를 조회하는 Query의 Root를 지정합니다.
4. [전체 조회] CreateQuery 내에서 root라는 엔티티 전체 검색을 합니다.
5. CreateQuery 내에 조건절을 추가합니다.
6. CreateQuery 내에 정렬 부분을 추가합니다.
7. 구성한 CriteriaQuery를 기반으로 쿼리를 생성하여 다건으로 반환받습니다.
import com.adjh.multiflex.jpa.dto.UserDto;
import com.adjh.multiflex.jpa.entity.UserEntity;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager em;
/**
* 사용자 리스트를 조회합니다.
*
* @return
*/
public List<UserEntity> selectUserList(UserDto userDto) {
// 1. CriteriaBuilder 인스턴스를 생성합니다.
CriteriaBuilder cb = em.getCriteriaBuilder();
// 2. UserEntity 타입의 CriteriaBuilder를 구성합니다.
CriteriaQuery<UserEntity> cq = cb.createQuery(UserEntity.class);
// 3. 데이터를 조회하는 Query의 Root를 지정합니다.
Root<UserEntity> root = cq.from(UserEntity.class);
// 4. [전체 조회] CreateQuery 내에서 root라는 엔티티 전체 검색을 합니다.
cq = cq.select(root);
// 5. CreateQuery 내에 조건절을 추가합니다.
cq = cq.where(
root.get("userSt").in("A", "I", "D"), // userSt IN ("A", "I", "D")
cb.equal(root.get("delYn"), false), // delYn = false
cb.equal(root.get("userNm"), userDto.getUserNm()), // userNm = #{userNm}
cb.equal(root.get("userId"), userDto.getUserId()) // userId = #{userId}
);
// OR
// 6. Predicate 객체로 분리하여 조건절을 구성합니다.
Predicate pWhere = cb.and(
cb.in(root.get("userId")).value(userDto.getUserId()), // userId = #{userId}
cb.equal(root.get("userNm"), userDto.getUserNm()) // userNm = #{userNm}
);
cq = cq.where(pWhere);
}
}
오늘도 감사합니다. 😀
반응형