Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.querydsl.example.ksp

import com.querydsl.core.annotations.QueryProjection
import jakarta.persistence.Convert
import jakarta.persistence.Entity
import jakarta.persistence.Id

Expand All @@ -9,7 +10,9 @@ class Bear(
@Id
val id: Int,
val name: String,
val location: String
val location: String,
@Convert(converter = BearSpeciesConverter::class)
val species: BearSpecies?
)

class BearSimplifiedProjection @QueryProjection constructor(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.querydsl.example.ksp

enum class BearSpecies {
BROWN_BEAR,
BLACK_BEAR,
POLAR_BEAR,
PANDA,
SUN_BEAR,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.querydsl.example.ksp

import jakarta.persistence.AttributeConverter
import jakarta.persistence.Converter

@Converter
class BearSpeciesConverter : AttributeConverter<BearSpecies, String> {

override fun convertToDatabaseColumn(attribute: BearSpecies?): String? {
return attribute?.name?.lowercase()
}

override fun convertToEntityAttribute(dbData: String?): BearSpecies? {
return dbData?.let {
try {
BearSpecies.valueOf(it.uppercase())
} catch (e: IllegalArgumentException) {
null
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import com.querydsl.example.ksp.Bear
import com.querydsl.example.ksp.BearSpecies
import com.querydsl.example.ksp.Cat
import com.querydsl.example.ksp.CatType
import com.querydsl.example.ksp.Dog
Expand Down Expand Up @@ -181,7 +182,7 @@ class Tests {
run {
val em = emf.createEntityManager()
em.transaction.begin()
em.persist(Bear(424, "Winnie", "The forest"))
em.persist(Bear(424, "Winnie", "The forest", null))
em.transaction.commit()
em.close()
}
Expand All @@ -207,10 +208,40 @@ class Tests {

@Test
fun `query projection exclude property from constructor`() {
assertThat(Bear::class.declaredMemberProperties.count()).isEqualTo(3)
assertThat(Bear::class.declaredMemberProperties.count()).isEqualTo(4)
assertThat(QBearSimplifiedProjection::class.primaryConstructor!!.parameters.count()).isEqualTo(2)
}

@Test
fun `enum with convert annotation generates EnumPath`() {
val emf = initialize()

run {
val em = emf.createEntityManager()
em.transaction.begin()
em.persist(Bear(501, "Baloo", "Jungle", null))
em.transaction.commit()
em.close()
}

run {
val em = emf.createEntityManager()
val queryFactory = JPAQueryFactory(em)
val q = QBear.bear

val bears = queryFactory
.select(q.species.coalesce(BearSpecies.BLACK_BEAR))
.from(q)
.orderBy(q.id.asc())
.fetch()

assertThat(bears.size).isEqualTo(1)
assertThat(bears[0]).isEqualTo(BearSpecies.BLACK_BEAR)

em.close()
}
}

@Test
fun `create and query dog with jsonb tag`() {
val emf = initialize()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@ class TypeExtractor(
}

private fun userType(type: KSType): QPropertyType.Unknown? {
if (type.isEnum()) {
return null
}

val userTypeAnnotations = listOf(
ClassName("org.hibernate.annotations", "Type"),
ClassName("org.hibernate.annotations", "JdbcTypeCode"),
Expand Down Expand Up @@ -204,3 +208,9 @@ private fun KSType.toClassNameSimple(): ClassName {
else -> error("Could not compute ClassName for '$this'")
}
}

private fun KSType.isEnum(): Boolean {
val referencedDeclaration = declaration

return referencedDeclaration is KSClassDeclaration && referencedDeclaration.classKind == ClassKind.ENUM_CLASS
}