У меня проблема с родным запросом, использующим данные весны jpa - PullRequest
3 голосов
/ 19 июня 2019

У меня есть запрос, который я могу получить из oracle db, но когда я использую этот запрос как собственный запрос в весенних данных jpa.Я получаю исключение как недопустимое имя таблицы

Вот мой текущий запрос

SELECT listagg(COLUMN_TWO,' ') within group (order by COLUMN_TWO) 
FROM (select 'RDIFP' as val from dual union all
      select 'RDIFP' as val from dual union all
      select 'DROWM' as val from dual
     ) v left join
     TABLE_NAME_ONE 
     on v.val = COLUMN_TWO, TABLE_NAME_TWO, TABLE_NAME_THREE
WHERE 
COLUMN_THREE = COLUMN_FOUR AND  
COLUMN_FIVE = COLUMN_SIX AND 
COLUMN_ONE = '176134'

Я использую его в весенних данных jpa код ниже

static final String QUERY_VALUES =
            "SELECT listagg(COLUMN_TWO,' ') within group (order by COLUMN_TWO) 
FROM (:prQry) v left join
     TABLE_NAME_ONE 
     on v.val = COLUMN_TWO, TABLE_NAME_TWO, TABLE_NAME_THREE
WHERE 
COLUMN_THREE = COLUMN_FOUR AND  
COLUMN_FIVE = COLUMN_SIX AND 
COLUMN_ONE = '176134'";

@Query(value = QUERY_VALUES, nativeQuery=true)
String getValuesById(@Param("prQry") String prQry);

Для параметраprQry Я сгенерирую запрос динамически и получу его в виде строки и передам его в качестве параметра, поскольку я передам значение как

String prQry= "select 'RDIFP' as val from dual union all
      select 'RDIFP' as val from dual union all
      select 'DROWM' as val from dual";

, после динамической итерации я получу, как указано выше.

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

1 Ответ

0 голосов
/ 19 июня 2019

К сожалению, вы не можете достичь этого с помощью репозиториев данных Spring, потому что параметры будут переводиться как строка и в конечном запросе, который у вас есть:

SELECT listagg(COLUMN_TWO,' ') within group (order by COLUMN_TWO)
FROM ("select 'RDIFP' as val from dual ... ") v

Это будет отображаться как строка и неверный запрос. @Param это только для предложения WHERE.

Один из способов добиться того, чего вы хотите, - использовать EntityManager:

@Autowired 
EntityManager entityManager;

static final String QUERY_VALUES =
        "SELECT listagg(COLUMN_TWO,' ') within group (order by COLUMN_TWO) 
            FROM (:prQry) v left join
                 TABLE_NAME_ONE 
                 on v.val = COLUMN_TWO, TABLE_NAME_TWO, TABLE_NAME_THREE
            WHERE 
            COLUMN_THREE = COLUMN_FOUR AND  
            COLUMN_FIVE = COLUMN_SIX AND 
            COLUMN_ONE = '176134'";

public String getValuesById(String prQry) {
    Query q = entityManager.createNativeQuery(QUERY_VALUES.replace(":prQry", prQry), String.class);
    return q.getSingleResult();
}

В любом случае это идея динамических запросов при изменении условия FROM.

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