no image
[JPA] Querydsl LocalDateTime 에서 Date 로 변환할 때 오류나는 경우 (feat. Oracle)
@Entity @Table(name = "SOME_ENTITY") public class SomeEntity { @Id @Column(name = "id") private Long id; @Column(name = "created_at") private LocalDateTime createdAt; } @Getter @Builder @NoArgsConstructor @AllArgsConstructor public class SomeDto { private LocalDateTime createdAt; } 위와 같은 Entity와 결과를 받아올 클래스가 있다고 가정하자. 여기서 Querydsl 의 Projections를 이용하여 createdAt 이라는 값을 select 한다고 해보자. 그러면 아래와 같이 작..
2024.03.06
no image
[JPA] QueryDSL 에서 enumPath 사용하기
회사에서 SQL 쿼리를 작성하다 보니 CASE WHEN을 사용해야 하는 경우가 있었는데(안티패턴으로 취급되기도 하지만) QueryDSL에서 CASE WHEN 과 함께 enum 으로 받고 싶어서 사용해보다가 뭔가 이상한 구석이 있어서 한번 기록으로 적어보았다. QueryDSL에서 CASE WHEN 사용법의 경우 이곳에 잘 정리되어 있다. 사용법 우선 EnumPath 를 사용할 경우 예시로 아래와 같이 사용할 수 있다. @RequiredArgsConstructor public class PartnerSubAccountRepositorySupportImpl implements PartnerSubAccountRepositorySupport { private final JPAQueryFactory queryFac..
2023.11.30
[JPA] QueryDSL 에서 오늘 날짜 활용해서 사용하기 (feat. Oracle)
아래와 같은 클래스가 있다. @Entity @Builder @Getter @NoArgsConstructor @AllArgsConstructor public class PremiumPrice { @Id private Long id; @Column private BigDecimal usdPrice; @Column @CreationTimestamp private LocalDateTime registDate; } 만약, 데이터를 찾을 때 registDate 를 기준으로 오늘 이후의 데이터를 찾고 싶으면 어떻게 할까? 여러 가지 방법이 있겠지만 이 글에서는 두 가지 방법을 소개한다. Expressions.dateTemplate Expressions.dateTemplate(LocalDateTime.class, "s..
2022.10.24
no image
[JPA] QueryDSL 에서 문자열을 숫자로 뽑아서 변환하기
Entity 안에서 String 으로 관리되고 있는 값을 다른 DTO 클래스에서 받을 때 BigDecimal 과 같은 데이터 타입으로 받고 싶다면 어떻게 할까? 물론, Entity 안에 있는 필드 데이터 타입과 똑같이 관리되면 좋겠지만 뭔가 크롤러 같은 프로그램에서 어딘가의 가격 데이터를 가져올 때 아래와 같은 데이터들이 포함된다고 해보자. '판매중이지 않음' '1200000' '없음' 만약, 위 데이터 중에서 숫자만 이루어진 것을 뽑아내려면 어떻게 해야 할까? 충분히 있을 수 있는 상황이다. 우선 아래와 같은 클래스가 있다고 하고, renewalPrice 라는 필드 값에 위와 같은 데이터들이 포함된다고 생각해보자 @Builder @Getter @NoArgsConstructor @AllArgsConstr..
2022.10.24
[JPA] Oracle 을 사용해서 Native Query 로 출력 개수까지 다 가져와보기
예를 들어, 아래와 같은 복잡한 질의가 있다. SELECT so.seqno , ... , CASE WHEN SYSDATE BETWEEN MIN(ev.startdate) AND MIN(ev.enddate) THEN 'Y' ELSE 'N' END AS event_flag , TO_CHAR(MIN(so.display_start), 'yyyy-mm-dd hh24:mi') AS display_start , TO_CHAR(MAX(so.display_end), 'yyyy-mm-dd hh24:mi') AS display_end , TO_CHAR(MIN(ev.startdate), 'yyyy-mm-dd hh24:mi') AS event_start_date , TO_CHAR(MAX(ev.enddate), 'yyyy-mm-d..
2022.10.17
[JPA] H2 DDL 초기 테스트 데이터 설정
요구 사항 만약, 아래와 같은 Entity 를 H2 데이터베이스 같은 곳에서 자동으로 DDL 이 이루어진 다음, 그 후에 스크립트 기반으로 데이터를 미리 넣어서 테스트 코드로 데이터를 사용하고 싶다고 해보자 @Builder @Getter @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "BOOKS") @DynamicInsert @DynamicUpdate public class Books { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) private Long id; @Column(name = "BOOK_CODE", null..
2022.10.01
no image
[ERROR] @WebMvcTest 시 Failed to load ApplicationContext 관련 (feat. JPA)
오류 내용 java.lang.IllegalStateException: Failed to load ApplicationContext ... Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'io.github.service.FooService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchi..
2022.06.07
no image
[Spring] JPA 에서 Oracle DB 사용할 때 DB 함수 사용하기
JPAExpressions 와 SQLExpressions 를 섞어서 사용할 수 없기 때문에 사용자가 수동으로 함수를 등록해주어야 한다. (대소문자는 상관없다) 이는 QueryDSL 에서도 적용이 되는데, 먼저 DB 설정에서 Adapter 를 설정해줄 때 아래와 같이 코드를 입력해주고, EntityManagerFactory 에서 사용하도록 해준다. ... @Bean public JpaVendorAdapter dbJpaVendorAdapter() { HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setDatabasePlatform("kr.pe.karsei.configs.DbDialect"); // Dialect 연결 ..
2022.04.04
no image
[Spring] JPA 와 Mybatis 동시 사용 시 Connection Deadlock 벗어나기
PHP 에서 Java 로 작업을 진행하면서 기존에 작성했던 Query 문을 사용해야 할 필요가 생었겼다. 근데 한번에 효율적으로 데이터들을 불러오려고 작성된 Query 를 사용하려다보니 우선은 Query 문의 길이가 길었고, DBMS 의 고유 기능을 사용한 것이 많았다. 사내에서 작성된 Query 들을 되돌아보니 DB 테이블들이 상당히 많아 복합적으로 Join 을 하거나 서브쿼리가 많이 존재했고, Oracle 의 START WITH ... CONNECT BY ... 처럼 특수 기능을 사용하고 있거나, LOB 관련 함수 등 그저 JPA 만으로는 분명 해결하기 까다로운 이슈들이 있다고 생각했다. 난이도도 있고 QueryDSL 를 사용한다고 해도 다른 사람들이 유지보수를 할 때 과연 잘 할 수 있을까? 하는 ..
2022.04.04