Я пытаюсь добавить метод запроса к AlertRepository
, используя NamedNativeQuery / ConstructorResult. Наш код Kotlin в значительной степени основан на этом примере Java: https://github.com/spring-projects/spring-data-examples/tree/master/jpa/jpa21#support-for-custom-sqlresultsetmapping-with-constructorresult
Вот что я добавил к сущности Alert
:
@SqlResultSetMapping(name = "hourly-alert-counts",
classes = [
ConstructorResult(targetClass = HourlyAlertCount::class, columns = [
ColumnResult(name = "day", type = Int::class),
ColumnResult(name = "hour", type = Int::class),
ColumnResult(name = "count", type = Long::class)
])
]
)
@NamedNativeQuery(
name = "Alert.getHourlyCountsByConfigurationItemId",
query = "select {fn DAYOFWEEK(reported_time)} as day, hour(reported_time) as hour, count(*) as count from alert\n" +
"where configuration_item = ?1 group by configuration_item, {fn DAYOFWEEK(reported_time)}, hour(reported_time)",
resultSetMapping = "hourly-alert-counts"
)
data class Alert(
...
и в репозиторий оповещений:
@Query(nativeQuery = true)
fun getHourlyCountsByConfigurationItemId(id: Long): List<HourlyAlertCount>
Наконец, POJO HourlyAlertCount:
data class HourlyAlertCount(
val day: Int,
val hour: Int,
val count: Long
)
Когда я достигаю этой конечной точки, я получаю следующую ошибку:
{"cause":null,"message":"Couldn't find PersistentEntity for type class xxx.HourlyAlertCount!"}
Предполагается, что ConstructorResult / ColumnResult являются аннотациями в Java, но наш код Kotlin не компилируется, если мы добавляем перед ними символ "@"; это сообщение в блоге предлагает игнорировать "@". Мы используем spring-data-jpa 2.09 и Hibernate 5.2.17.