JPA

[JPA] Spring Data JPA와 Querydsl (feat. Spring MVC)

EntityListener

@PrePersist
@PostPersist
@PreUpdate
@PostUpdate
@PreRemove
@PostRemove
@PostLoad

AttributeConverter

@Converter
class SnackNutrientConverter : AttributeConverter<SnackNutrient, String> {

    private val mapper = jacksonObjectMapper()

    override fun convertToDatabaseColumn(attribute: SnackNutrient): String {
        return mapper.writeValueAsString(attribute)
    }

    override fun convertToEntityAttribute(dbData: String): SnackNutrient {
        return mapper.readValue(dbData)
    }
}

Repository Custom, Extend

interface SnackRepositoryCustom {
    fun findBy(name: String): Snack?
}

@Repository
@Transactional
class SnackRepositoryCustomImpl(private val em: EntityManager) : SnackRepositoryCustom {

    override fun findBy(name: String): Snack? {
        return em.createQuery("SELECT s FROM Snack s WHERE s.name = :name", Snack::class.java)
            .setParameter("name", name)
            .resultList.firstOrNull()
    }
}

기본 Repository Custom

interface MyRepo<T, ID> : JpaRepository<T, ID>
class MyRepoImpl<T, ID>() : MyRepo<T, ID>, SimpleJpaRepository<T, ID>()
@EnableJpaRepositories(repositoryBaseClass = MyRepoImpl::class)

Querydsl

http://www.querydsl.com/static/querydsl/4.0.1/reference/ko-KR/html_single/

 

Querydsl - 레퍼런스 문서

Querydsl은 JPA, JDO, Mongodb 모듈에서 코드 생성을 위해 자바6의 APT 어노테이션 처리 기능을 사용한다. 이 절에서는 코드 생성을 위한 다양한 설정 옵션과 APT에 대한 대안을 설명한다. 기본적으로 Query

www.querydsl.com

의존성 및 어노테이션 프로세서 추가

implementation("com.querydsl:querydsl-jpa")
kapt("com.querydsl:querydsl-apt:4.2.1:jpa")

QDomain 생성

./gradlew kaptKotlin -i -S

기본 사용법

val car = QCar.car
val query = JPAQuery<Car>(em)

val result = query.from(car)
    .where(car.name.eq("asd"))
    .fetch()

Spring Data JPA 와 함께 사용하기

@Transactional
class SnackRepositoryCustomImpl : SnackRepositoryCustom, QuerydslRepositorySupport(Snack::class.java) {

    override fun findBy(name: String): Snack? {
        return entityManager!!.createQuery("SELECT s FROM Snack s WHERE s.name = :name", Snack::class.java)
            .setParameter("name", name)
            .resultList.firstOrNull()
    }

    override fun findAllBy(name: String): List<Snack> {
        val snack = QSnack.snack

        return from(snack)
            .where(snack.name.eq(name))
            .fetch()
    }
}