Java Spring StringIndexOutOfBoundsException при использовании UNION в NativeQuery - PullRequest
0 голосов
/ 31 мая 2019

Я нигде не смог найти ни похожую проблему, ни похожий ответ, и после многих часов поиска я наконец нашел решение.

ПРОБЛЕМА:

Использование UNION в JavaСобственный запрос и значение столбца, всегда являющееся пустой строкой ('')

(быстрый пример) Строка запроса

String queryString = "SELECT * FROM ( " +
    "    SELECT  " +
    "        a_type as 'Contract Type', " +
    "        name as 'Full Name', " +
    "        lent_value as 'Credits', " +
    "        '' as 'Payment Info' " +
    "    FROM free_users " +
    "    UNION " +
    "    SELECT  " +
    "        type as 'Contract Type', " +
    "        name as 'Full Name', " +
    "        value as 'Credits', " +
    "        payment_info as 'Payment Info' " +
    "    FROM paid_users " +
    ") results " +
    "ORDER BY results.`Full Name` ";

Создание запроса с помощью Entity Manager

Query query = entityManager.createNativeQuery(queryString);

И выполнить его

query.getResultList();

Ошибка, которая возвращается в StringIndexOutOfBoundsException с сообщением об ошибке String index out of range: 0

Эта проблема возникает из-за пустой строкив столбце первый SELECT.

Спящий режим не может соответствовать значению '' первого SELECT, поэтому следующий UNION завершается ошибкой.

Значение столбца должно быть не менее , строка длиной 1 символ

ИсправленоСтрока запроса

String correctedQueryString = "SELECT * FROM ( " +
    "    SELECT  " +
    "        a_type as 'Contract Type', " +
    "        name as 'Full Name', " +
    "        lent_value as 'Credits', " +
    "        'p' as 'Payment Info' " +
    "    FROM free_users " +
    "    UNION " +
    "    SELECT  " +
    "        type as 'Contract Type', " +
    "        name as 'Full Name', " +
    "        value as 'Credits', " +
    "        payment_info as 'Payment Info' " +
    "    FROM paid_users " +
    ") results " +
    "ORDER BY results.`Full Name` ";
...