Database ( DB )/JPA, Querydsl 18

JPA에서 like 사용하는 방법

1. @Query에 아래와 같이 LIKE CONCAT을 사용합니다. @Query("SELECT u.username FROM User u WHERE u.username LIKE CONCAT('%',:username,'%')") List findUsersWithPartOfName(@Param("username") String username); 2. 다음은 JPA문법을 사용한 방법입니다. Using Like: select ... like :username List findByUsernameLike(String username); StartingWith: select ... like :username% List findByUsernameStartingWith(String username); EndingWith..

Spring Data Jpa에서 Native Query를 사용하는 방법

Spring Data JPA는 Java Persistence API (JPA)를 기반으로 구현된 라이브러리입니다. 이를 사용하면 Java 객체와 관계형 데이터베이스 간의 매핑을 쉽게 할 수 있습니다. Spring Data JPA는 JPQL (Java Persistence Query Language)을 지원합니다. 하지만 때로는 JPQL로는 해결하기 어려운 쿼리가 있습니다. 이럴 때는 네이티브 쿼리 (Native Query)를 사용할 수 있습니다. 네이티브 쿼리는 SQL 문법을 사용하여 데이터베이스와 상호작용할 수 있습니다. Spring Data JPA에서 네이티브 쿼리를 사용하려면 다음과 같은 단계를 따르면 됩니다. 1. 엔티티 클래스에서 @SqlResultSetMapping 어노테이션을 사용하여 매핑 ..

jpa + querydsl + sqlite 페이징 처리 방법

JPA는 기본적으로 sqlite를 지원하지 않기 때문에 SQLDialect를 생성해야 합니다. 구글에 검색해보면 보통 아래 코드가 나옵니다. import java.sql.Types; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.VarArgsSQLFunction; import org.hibernate.dialect.identity.IdentityColumnSupport; import org.hibernate...

JPA에서 insert, update, delete 할 때 자동으로 select 하지 않게 하는 방법

JPA에서 CRUD 중 Create(insert), Update, Delete query를 할 때, 원하지 않는 select query가 발생합니다. 다음 예제를 먼저 보겠습니다. select query가 발생하는 예제 먼저 User entity class를 생성합니다. import lombok.Getter; import lombok.Setter; import javax.persistence.Entity; import javax.persistence.Id; @Entity @Getter @Setter public class User { @Id private String userId; private String userName; private int age; } entity를 사용할 repository cl..

querydsl 5.0 - fetchResult, fetchCount deprecated

이전 프로젝트에서는 안 그랬는데 신규 프로젝트 개발을 위해 프로젝트를 생성했더니 아래 그림과 같이 fetchCount, fetchResults에 취소선이 생겨있어서 내용을 확인해봤습니다. 결론은 Querydsl 5.0부터 fetchResult()와 fetchCount()가 deprecated 되었습니다. 그에 대한 내용은 다음과 같습니다. fetchResults() : Get the projection in QueryResults form. Make sure to use fetch() instead if you do not rely on the QueryResults.getOffset() or QueryResults.getLimit(), because it will be more performant. A..

[JPA] Entity Column 상속

Database 테이블을 설계하다 보면 Column이 중복되는 경우가 많습니다. 대표적으로 이력관리를 위해 사용하는 "생성한 사람, 생성일, 마지막 수정한 사람, 마지막 수정일" 등이 있습니다. 이렇게 중복되는 Column은 @MappedSuperclass를 사용하여 중복을 제거할 수 있습니다. 먼저, 부모 크래스를 만들어서 중복된 Column을 정의합니다. import java.time.LocalDateTime; import javax.persistence.Column; import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; import org.springframework.data.annotation.Cre..

QueryDSL - order by count as alias

QueryDSL 사용 중, 다음과 같은 query가 있습니다. factory .select(Projections.bean(ComboVO.class , pcTbPositionCode.userPositionCode.as("comboCode") , pcTbPositionCode.userPositionNameKr.as("comboLabel") , pcTbPositionCode.userPositionCode.as("comboVal"))) .from(pcTbPositionCode) .where(pcTbPositionCode.chkused.eq("1")) .fetch(); 이때, userPositionCode가 아닌 comboCode로 order by를 하려면 어떻게 해야 할까요? 방법은 다음과 같습니다. Strin..

[querydsl] Executing an update/delete query

Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query querydsl에서 insert/update 시, 위와 같은 오류가 발생했을 경우 다음과 같이 @Transactional 어노테이션을 추가해야 합니다. @Transactional @RequestMapping(value = "/login", produces = "application/json;charset=UTF-8") public String login(HttpServletRequest request) { // ... } querydsl 메서드에 적용하지 않고, qu..

Entity Inheritence in JPA

데이터베이스 테이블을 설계하다 보면 column이 중복되는 경우가 생각보다 많습니다. 대표적으로 등록한 사람, 등록일시, 수정한 사람, 수정일시 등이 있는데요 이것을 일일히 쓰기에는 여간 귀찮은 일이 아닙니다. 이럴 때 @MappedSuperclass를 사용하면 됩니다. 그럼 지금부터 예제 코드를 보겠습니다. 먼저, BaseTme 클래스를 생성합니다. import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import j..

728x90
loading