Создать пользовательскую функцию с помощью пользовательской реализации репозитория в Spring Data JPAJAVA

Программисты JAVA общаются здесь
Anonymous
Создать пользовательскую функцию с помощью пользовательской реализации репозитория в Spring Data JPA

Сообщение Anonymous »

Я хочу определить пользовательский репозиторий с помощью Spring Data JPA. Вот как я это делаю < /p>
interface CustomFooRepository {
fun getFooValues(
type: SOME_CONSTANT_ENUM
entity: BaseEntity
): List
}

class CustomFooRepositoryImpl(
jpaContext: JpaContext,
entityClass: Class
) : CustomFooRepository {
private val em: EntityManager = jpaContext.getEntityManagerByManagedType(entityClass)
private val tableName: String = em
.metamodel
.entity(entityClass)
.name.lowercase()

override fun getFooValues(
type: SOME_CONSTANT_ENUM
entity: BaseEntity
): List {
val columnName = when (type) {
SOME_CONSTANT_ENUM.a -> "a_id"
SOME_CONSTANT_ENUM.b -> "b_id"
SOME_CONSTANT_ENUM.c -> "c_id"
}
return em.createNativeQuery(
"SELECT * FROM $tableName WHERE $columnName = :entityId",
Foo::class.java
)
.setParameter("entityId", entity.id)
.resultList as List
}
}

@NoRepositoryBean
interface FooBarBaseRepository : JpaRepository,
CustomFooRepository
< /code>
И это baseentity < /p>
@MappedSuperclass
class BaseEntity(
@Column(name = "created", nullable = false, columnDefinition = "TIMESTAMP WITH TIME ZONE")
val created: ZonedDateTime = ZonedDateTime.now(),

@Column(name = "updated", nullable = true, columnDefinition = "TIMESTAMP WITH TIME ZONE")
var updated: ZonedDateTime? = null,
) : BaseEntity() {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
open val id: Long = 0

@PreUpdate
private fun onPreUpdate() {
this.updated = ZonedDateTime.now()
}
}
< /code>
И это Foo и Bar < /p>
sealed class Foo(
factor: Double,
someId: SomeEmbeddedId,
) : ..., ...(
factor
someId
) {
companion object {
const val A = "a_id"
const val B = "b_id"
const val C = "c_id"
}

@Entity
@Table(
name = "...",
uniqueConstraints = [
UniqueConstraint(
name = "...",
columnNames = [A, B, C]
)
]
)
class Bar(
factor: Double,
someId: SomeEmbeddedId,
) : EmissionFactor(
factor,
someId
)
}
< /code>
Когда я составляю это, я получаю следующую ошибку < /p>

Не удалось создать запрос для метода public rable java.util.list com.repository.customfooorepository.getfoovalues ​​(com.constants.some_constant_enum, com.entity.base.Base.Base.Base. Нет собственности 'GetFoovalues', найденные для Type 'Bar'

Такое похоже на то, что JPA пытается построить запрос на основе свойств через синтаксис JPA нативного пружины, что я не хочу.

Подробнее здесь: https://stackoverflow.com/questions/796 ... g-data-jpa

Вернуться в «JAVA»