Как связать UUID как параметр VARCHAR в нативном запросе?

Вопрос или проблема

Я добавляю новый столбец – uuid с типом varchar(36) в Oracle DB. У меня есть запрос на поиск, который искал по идентификаторам, теперь мне нужно добавить аналогичный запрос, но с использованием uuids.

@Column(name = "UUID")
@Type(type = "uuid-char")
var uuid: UUID? = null

Запрос JPA:

    @Query(
        """
            SELECT 
            t.id,
            t.uuid,
...
            FROM my_table t
            START WITH t.uuid in (:uuids)
            CONNECT BY PRIOR t.parent_id = t.id
        """,
        nativeQuery = true
    )

Но uuids связываются как Binary:

binding parameter [1] as [BINARY] - [00440c26-219d-4a81-adb9-9c16f617bffb]

и результирующий набор данных пуст.

Запуск этого запроса напрямую с uuids, переданными в кавычках, возвращает ожидаемый набор результатов. Как мне объявить параметр, чтобы он связывался как VARCHAR?

Ответ или решение

Для привязки UUID в формате VARCHAR в нативном запросе JPA в Oracle DB, вам необходимо убедиться, что параметры, которые вы передаёте в запрос, правильно конвертированы в строковый формат. Oracle ожидает, что UUID будут представлены как строки, а не как бинарные данные.

В вашем случае, вы можете использовать следующие подходы для правильной привязки параметров:

  1. Преобразование UUID в строки: При создании списка UUID, который вы передаете в запрос, вы можете преобразовать их в строки. Например, если вы используете Kotlin, вы можете сделать это с помощью метода toString().

  2. Использование @Param: Вам нужно будет использовать аннотацию @Param для связывания параметра с ним. Таким образом, ваша JPA аннотация будет выглядеть следующим образом:
@Query(
    """
        SELECT 
        t.id,
        t.uuid,
        ...
        FROM my_table t
        START WITH t.uuid in (:uuids)
        CONNECT BY PRIOR t.parent_id = t.id
    """,
    nativeQuery = true
)
fun findByUuids(@Param("uuids") uuids: List<String>): List<MyEntity>
  1. Передача UUID в виде строк: Прежде чем передавать список UUID в методе, преобразуйте его в список строк:
val uuidList: List<UUID> = listOf(...)

// Преобразуйте UUID в строки
val stringUuidList = uuidList.map { it.toString() }

// Теперь вызывайте ваш запрос
val results = myRepository.findByUuids(stringUuidList)
  1. Проверка запроса: Убедитесь, что ваш запрос выполняется в правильном контексте. Проверьте, имеет ли ваша таблица my_table ожидаемые данные и корректные UUID в формате VARCHAR.

С этими изменениями, ваше приложение должно правильно связывать UUID и выполнять запрос с ожидаемыми результатами. Использование строкового формата для UUID в вашем SQL-запросе обеспечит корректное сопоставление и избегание проблем, связанных с бинарным кодированием.

Оцените материал
Добавить комментарий

Капча загружается...