인프런 커뮤니티 질문&답변

hooyoung.paul.lee님의 프로필 이미지
hooyoung.paul.lee

작성한 질문수

실전! 스프링 데이터 JPA

select 절에 조건식을 넣는 방법

작성

·

266

0

강사님, 궁금한게 있습니다.

select 절에 조건식을 넣고 싶은데 어떻게 해야 할까요?

예)

select
start_post_dt,
end_post_dt,
news_title
(now() >= start_post_dt and now() <= end_post_dt) as DateInRange
from dummy_table;

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. hooyoung.paul.lee님

case when을 사용해야 하는데요.

다음과 같이 JPQL을 작성하면 됩니다.

SELECT p.startPostDt, p.endPostDt, p.newsTitle, 
           CASE WHEN CURRENT_TIMESTAMP BETWEEN p.startPostDt AND p.endPostDt THEN 1 ELSE 0 END 
           FROM DummyTable p

다음 코드를 참고해주세요.

package com.example.demo.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;

import java.time.LocalDateTime;

@Entity
@Data
public class DummyTable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private LocalDateTime startPostDt;

    private LocalDateTime endPostDt;

    private String newsTitle;

    // Getter, Setter ...
}

 

package com.example.demo.entity;

import jakarta.persistence.EntityManager;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.time.LocalDateTime;
import java.util.List;

@DataJpaTest
class DummyTableTest {

    @Autowired
    EntityManager em;

    @Test
    void casewhen() {
        DummyTable dummy1 = new DummyTable();
        dummy1.setStartPostDt(LocalDateTime.now().minusDays(1));
        dummy1.setEndPostDt(LocalDateTime.now().plusDays(1));
        dummy1.setNewsTitle("News 1");
        em.persist(dummy1);

        DummyTable dummy2 = new DummyTable();
        dummy2.setStartPostDt(LocalDateTime.now().plusDays(1));
        dummy2.setEndPostDt(LocalDateTime.now().plusDays(2));
        dummy2.setNewsTitle("News 2");
        em.persist(dummy2);

        String jpql = "SELECT p.startPostDt, p.endPostDt, p.newsTitle, " +
                "           CASE WHEN CURRENT_TIMESTAMP BETWEEN p.startPostDt AND p.endPostDt THEN 1 ELSE 0 END " +
                "           FROM DummyTable p";
        List<Object[]> results = em.createQuery(jpql)
                .getResultList();
        // Execute JPQL
        for (Object[] result : results) {
            System.out.println("startPostDt: " + result[0] +
                    ", endPostDt: " + result[1] +
                    ", newsTitle: " + result[2] +
                    ", DateInRange: " + result[3]);
        }
    }
}

감사합니다.

강사님, 바쁘실텐데 답변도 주시고 또 예제 코드도 보내주셨네요 ^^

감사합니다.

말씀해주신 덕분에 Object로 받아오면서 문제를 해결했습니다.

 

하나 더 궁금한게 생겼는데...

이 값을 DTO로 받으려고 한다면 각 마지막 날짜 비교 컬럼을 임의의 alias로 주는 방법으로 가능할듯 한데... 강사님 강의 중에서 alias를 사용하지 않는다(?)라고 하셨던게 기억납니다.

이럴 경우는 알려주신 방법처럼 Object로 받아서 처리하는게 일반적인지요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. hooyoung.paul.lee님

DTO로 조회하려면 alias를 주어야 합니다^^

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요.

select 절에서 조건식을 사용하고 싶으시다면, 다음과 같은 방법을 사용하실 수 있습니다.

예시:
SELECT start_post_dt,
end_post_dt,
news_title,
CASE
WHEN now() >= start_post_dt and now() <= end_post_dt THEN ‘DateInRange’
ELSE ‘DateOutOfRange’
END as DateInRangefrom
FROM dummy_table;

위의 예시에서는 CASE문을 활용하여, 조건식 결과에 따라 DateInRange 또는 DateOutOfRange 값을 반환하는 것을 볼 수 있습니다. 이렇게 반환된 값을 새로운 열로 지정하여 select 절에서 사용할 수 있습니다.

참고로, now() 함수는 현재 날짜와 시간을 반환하며, dummy_table은 테이블명이므로, 자신이 사용하는 테이블명에 맞게 사용하시면 됩니다.

조건식을 포함한 select 문을 작성하실 때는, 문법적인 오류나 원하는 결과와 일치하지 않는 결과가 나오지 않도록 꼼꼼히 확인해보시길 바랍니다.

도움이 되었기를 바라며, 좋은 결과 얻으시길 기원합니다. 감사합니다.

hooyoung.paul.lee님의 프로필 이미지
hooyoung.paul.lee

작성한 질문수

질문하기