Spring JPA Projection не работает с типами UUID? - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть проект с Kotlin и Springboot. В этом проекте у организации есть следующие поля: id, name и parent. Я хочу только получить id и name. Поэтому я сделал представление интерфейса проекции для этой сущности.

Это моя сущность:

@Entity
data class Keyword(

    @Id
    @GeneratedValue(generator = "uuid2")
    @GenericGenerator(name = "uuid2", strategy = "uuid2")
    @Column(columnDefinition = "BINARY(16)")
    var id: UUID? = null,

    @Column(columnDefinition = "BINARY(16)")
    var parent: UUID? = null,

    @NotBlank
    var name: String? = null

)

Репозиторий:

@Repository
interface KeywordRepository: JpaRepository<Keyword, UUID> {

    @Query(value = "SELECT keyword.id, keyword.parent, keyword.name FROM keyword LEFT JOIN project_keyword ON project_keyword.keyword_id = keyword.id WHERE project_keyword.project_id LIKE :id", nativeQuery = true)
    fun findAllKeywordsByProjectId(id: UUID): MutableList<KeyWordView>
}

Служба:

@Service
class KeywordService (
  private val projectService: ProjectService,
  private val keywordRepository: KeywordRepository
) {

    fun getKeywordsByProjectId(id: UUID): MutableList<KeyWordView> {

        projectService.checkIfProjectExistsById(id)

        return keywordRepository.findAllKeywordsByProjectId(id).toMutableList()
    }
}

Мой класс интерфейса проекции:

interface KeyWordView {

    val id: UUID

    val name: String?
}

Когда я вызываю эту конечную точку через класс контроллера. Я получаю этот вывод:

 "list": [
      {
        "name": "MARINE MICROBIOTA",
        "id": "0,31,-36,77,29,123,66,-25,-127,-43,-31,83,104,-90,47,10"
      }
    ]

Но если я изменю val id: String на val id: UUID в моем KeywordView интерфейсе, я получаю следующую ошибку:

{
  "code": 500,
  "data": null,
  "message": "Could not write JSON: Projection type must be an interface!; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Projection type must be an interface! (through reference chain: no.inmeta.ris.util.response.ResponseDto[\"data\"]->no.inmeta.ris.util.pagination.PageDto[\"list\"]->java.util.ArrayList[0]->com.sun.proxy.$Proxy199[\"id\"])",
  "status": "FAIL"
}

Кто-нибудь знает Как решить эту проблему? Я хочу получить UUID как UUID не в странном формате.

Спасибо!

1 Ответ

0 голосов
/ 13 февраля 2020

Полагаю, проблема в классе UUID. Поскольку ваша сущность заявляет, что вы определили dir hibernate, что столбец в db является двоичным (16). И я предполагаю, что использование этого типа UUID в проекции интерфейса не работает, так как нет действительной информации отображения (как преобразовать данные, поступающие в виде двоичного файла длиной 16 байтов, в класс UUID). Поэтому я предполагаю, что вы должны изменить тип вашего столбца или использовать строку и написать функцию для преобразования этой строки.

Другая возможность - создать вторую таблицу для этой таблицы, используя только два желаемых столбца. И просто используйте этот второй дао, как вы используете свою проекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...