티스토리 뷰
728x90
반응형
JPASQLQuery
네이티브 SQL 쿼리를 생성하고 실행하기 위한 QueryDSL 클래스
SQL 힌트나 기타 데이터베이스에 종속적인 설정(예: 인덱스 힌트)을 적용
반면, JPAQuery는 JPQL을 생성하는 데 사용됩니다.
JPQL은 데이터베이스 독립적인 추상화 계층을 제공하기 때문에,
힌트나 플래그 같은 SQL 종속적인 요소를 직접 추가하는 기능을 지원하지 않습니다.
addFlag()
addFlag(QueryFlag.Position, String) 메서드는 쿼리에 특정 플래그를 추가하여
QueryDSL이 생성하는 SQL에 원하는 텍스트(예: SQL 힌트)를 삽입할 수 있도록 해줍니다.
- 첫 번째 인자: 플래그를 삽입할 위치 (QueryFlag.Position)
- 두 번째 인자: 삽입할 텍스트 (예: SQL 힌트)
http://querydsl.com/static/querydsl/4.0.3/apidocs/com/querydsl/core/QueryFlag.Position.html
주의사항
데이터베이스 종속적:
- SQL 힌트는 데이터베이스 엔진마다 다릅니다.
예를 들어, Oracle과 MySQL, SQL Server는 각기 다른 힌트 문법을 사용합니다. - 작성한 힌트가 사용하는 데이터베이스와 호환되는지 확인해야 합니다.
JPQL과 SQL 차이:
- addFlag()는 SQL 플래그를 추가하지만, JPQL 문법에는 맞지 않을 수 있습니다.
따라서 JPQL 쿼리에서는 사용 시 유의해야 합니다.
SELECT와 DISTINCT 사이에 힌트를 삽입하는 것은 불가능
QueryFlag.Position.AFTER_SELECT는 SELECT 키워드 뒤에 힌트를 추가하지만,
DISTINCT가 사용된 경우, DISTINCT 이후에 추가됩니다.
QUser user = QUser.user;
JPQLQuery<Long> query = new JPAQuery<>(entityManager);
List<Long> results = query
.select(user.id)
.addFlag(QueryFlag.Position.AFTER_SELECT, "/*+ INDEX(user IDX_USER_AGE) */") // SELECT 바로 뒤에 힌트 추가
.distinct()
.from(user)
.where(user.age.goe(30))
.fetch();
SELECT DISTINCT /*+ INDEX(user IDX_USER_AGE) */ user.id
FROM User user
WHERE user.age >= 30
Expressions.stringTemplate()을 활용하여 직접 처리
QUser user = QUser.user;
JPQLQuery<Long> query = new JPAQuery<>(entityManager);
List<Long> results = query
.select(Expressions.stringTemplate("/*+ INDEX(user IDX_USER_AGE) */ DISTINCT {0}", user.id))
.from(user)
.where(user.age.goe(30))
.fetch();
SELECT /*+ INDEX(user IDX_USER_AGE) */ DISTINCT user.id
FROM User user
WHERE user.age >= 30
숫자 타입을 반환할 때 Expressions.numberTemplate()
QUser user = QUser.user;
JPASQLQuery<Long> query = new JPASQLQuery<>(entityManager, SQLTemplates.DEFAULT);
List<Long> results = query
.select(Expressions.numberTemplate(Long.class, "/*+ INDEX(user IDX_USER_AGE) */ DISTINCT {0}", user.id))
.from(user)
.where(user.age.goe(30))
.fetch();
728x90
반응형
'Spring > JPA' 카테고리의 다른 글
JPA 영속성 관리 (0) | 2020.05.24 |
---|---|
JPA (Java Persistence API) (0) | 2020.05.24 |
반응형
300x250