728x90
반응형
JPA는 복잡한 검색 조건을 사용해서 엔티티 객체를 조회할 수 있는 다양한 쿼리 기술을 지원함
ORM을 사용하면 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 개발하므로 검색도 엔티티 객체를 대상으로 하는 방법이 필요
JPQL(Java Persistence Query Language)
- 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
- SQL을 추상화해서 특정 데이터베이스에 의존하지 않음
JPA는 JPQL을 분석하여 적절한 SQL을 만들어 데이터베이스를 조회
→ 조회한 결과로 엔티티 객체를 생성해서 반환
문제는 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다는 것
JPQL 사용 시 데이터베이스 방언(Dialect)를 지정해서 사용
→ 선택한 방언에 따라 해당 데이터베이스에 맞춘 적절한 SQL함수가 실행됨
데이터베이스 방언
SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
- 가변 문자: VARCHAR(MySQL), VARCHAR2(Oracle)
- 문자열을 자르는 함수: SUBSTRING(SQL 표준), SUBSTR( Oracle )
- 페이징: LIMIT(MySQL), ROWNUM(Oracle)
이러한 차이를 방언(Dialect)라고 하며, JPA에서는 추상화된 방언 클래스를 제공
→ 데이터베이스 방언만 변경하면 JPQL을 수정하지 않아도 데이터베이스 변경 가능
방언 설정
application.yml(application.properties) 에서 설정
spring:
jpa:
database-platform: org.hibernate.dialect.MariaDBDialect
Dialect는 보통 데이터베이스 이름 + 버전으로 되어 있음
- H2: org.hibernate.dialect.H2Dialect
- Oracle 10g: org.hibernate.dialect.Oracle10gDielect
- MySQL: org.hibernate.dialect.MySQL5InnoDBDialect
- MariaDB : org.hibernate.dialect.MariaDBDialect
그외 hibernate 방언:
https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/dialect/package-summary.html
728x90
반응형
'JPA' 카테고리의 다른 글
[JPA] Fetch type, N+1 문제 (0) | 2024.05.23 |
---|---|
[JPA] 영속성 전이 : CASCADE (0) | 2024.05.23 |