«; ожидается «., («; выполнение запроса JPA

#oracle #spring-boot #spring-data-jpa #eclipselink #spring-test-dbunit

#Oracle #весенняя загрузка #spring-data-jpa #eclipselink #spring-test-dbunit

Вопрос:

У меня есть этот jpa-запрос

 @Query(nativeQuery = true, value = "withn"
              "    validBonansasAssignation as (n"
              "        select aga.autorisation_bonansas_id, aga.autorisation_bonansa_assign_id as iBonansaAffectation_id,n"
              "               s.site_id as ISiteNoTypeBaseData_id, s.desc_court as iSiteNoTypeBaseData_nom,n"
              "               aga.dt_debut as iBonansaAffectation_dt_debut, aga.dt_fin as iBonansaAffectation_dt_finn"
              "        from AUTORISATION_BONANSA_ASSIGNATION agan"
              "        inner join site s on aga.site_id = s.site_idn"
              "        where ?1 between aga.dt_debut and aga.dt_finn"
              "    )n"
              "select ag.AUTORISATION_BONANSAS_ID, ag.NOM, ag.PRENOM, ag.EULOGIN, ag.dt_Debut, ag.dt_Finn"
              "    , aga.iBonansaAffectation_id, aga.iSiteNoTypeBaseData_id, aga.iSiteNoTypeBaseData_nomn"
              "    , aga.iBonansaAffectation_dt_debut, aga.iBonansaAffectation_dt_finn"
              "from autorisation_bonansa agn"
              "left join validBonansasAssignation aga on ag.autorisation_bonansas_id = aga.autorisation_bonansas_idn"
              "where ?1 between ag.dt_debut and ag.dt_finn"
              "and ag.organisation_id = ?2")
List<AutoUsers> find(Date date, Long id);
  

но когда я запускаю тест, у меня возникает эта ошибка:

 org.springframework.orm.jpa.JpaSystemException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.2.v20180622-f627448): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "WITH
    VALIDBONANSASASSIGNATION AS[*] (
        SELECT AGA.AUTORISATION_BONANSAS_ID, AGA.AUTORISATION_BONANSA_ASSIGN_ID AS IBONANSAAFFECTATION_ID,
                  S.SITE_ID AS ISITENOTYPEBASEDATA_ID, S.DESC_COURT AS ISITENOTYPEBASEDATA_NOM,
               AGA.DT_DEBUT AS IBONANSAAFFECTATION_DT_DEBUT, AGA.DT_FIN AS IBONANSAAFFECTATION_DT_FIN
        FROM AUTORISATION_BONANSA_ASSIGNATION AGA
        INNER JOIN SITE S ON AGA.SITE_ID = S.SITE_ID
        WHERE ? BETWEEN AGA.DT_DEBUT AND AGA.DT_FIN
    )
SELECT AG.AUTORISATION_BONANSAS_ID, AG.NOM, AG.PRENOM, AG.EULOGIN, AG.DT_DEBUT, AG.DT_FIN
    , AGA.IBONANSAAFFECTATION_ID, AGA.ISITENOTYPEBASEDATA_ID, AGA.ISITENOTYPEBASEDATA_NOM
    , AGA.IBONANSAAFFECTATION_DT_DEBUT, AGA.IBONANSAAFFECTATION_DT_FIN
FROM AUTORISATION_BONANSA AG
LEFT JOIN VALIDBONANSASASSIGNATION AGA ON AG.AUTORISATION_BONANSAS_ID = AGA.AUTORISATION_BONANSAS_ID
WHERE ? BETWEEN AG.DT_DEBUT AND AG.DT_FIN
AND AG.ORGANISATION_ID = ? "; expected "., ("; SQL statement:
  

Комментарии:

1. Извините, если мой вопрос глупый, если я не ошибаюсь, это так nativeQuery . Я прав?

2. действительно, это NativeQuery

Ответ №1:

Можете ли вы установить nativeQuery = true , как показано ниже, и посмотреть, работает ли это.

 @Query(
  value = "SELECT * FROM USERS u WHERE u.status = 1", 
  nativeQuery = true)
  

Ответ №2:

Способ, которым исходный запрос генерируется путем JPA формирования стека ошибок, я бы предложил изменить, как показано ниже, и попробовать,

Сейчас у меня нет среды IDE для фактического изменения запроса в надлежащем формате, поэтому я предоставил запрос в формате SQL, но цель состоит в том, чтобы определить столбцы в WITH предложении, потому что, как вы видите в стеке ошибок, он был сгенерирован как WITH VALIDBONANSASASSIGNATION AS[*] ( , и это [*] после AS того, как Oracle не распознает и выдает синтаксическую ошибку.

 WITH VALIDBONANSASASSIGNATION 
(
  AUTORISATION_BONANSAS_ID
, IBONANSAAFFECTATION_ID
, ISITENOTYPEBASEDATA_ID
, ISITENOTYPEBASEDATA_NOM
, IBONANSAAFFECTATION_DT_DEBUT
, IBONANSAAFFECTATION_DT_FIN
)
AS
(
  SELECT AGA.AUTORISATION_BONANSAS_ID
       , AGA.AUTORISATION_BONANSA_ASSIGN_ID AS IBONANSAAFFECTATION_ID
       , S.SITE_ID AS ISITENOTYPEBASEDATA_ID
       , S.DESC_COURT AS ISITENOTYPEBASEDATA_NOM
       , AGA.DT_DEBUT AS IBONANSAAFFECTATION_DT_DEBUT
       , AGA.DT_FIN AS IBONANSAAFFECTATION_DT_FIN
    FROM AUTORISATION_BONANSA_ASSIGNATION AGA
  INNER JOIN SITE S 
     ON AGA.SITE_ID = S.SITE_ID
  WHERE ? BETWEEN AGA.DT_DEBUT 
    AND AGA.DT_FIN
)
SELECT AG.AUTORISATION_BONANSAS_ID
     , AG.NOM
     , AG.PRENOM
     , AG.EULOGIN
     , AG.DT_DEBUT
     , AG.DT_FIN
     , AGA.IBONANSAAFFECTATION_ID
     , AGA.ISITENOTYPEBASEDATA_ID
     , AGA.ISITENOTYPEBASEDATA_NOM
     , AGA.IBONANSAAFFECTATION_DT_DEBUT
     , AGA.IBONANSAAFFECTATION_DT_FIN
FROM AUTORISATION_BONANSA AG
LEFT JOIN VALIDBONANSASASSIGNATION AGA 
  ON AG.AUTORISATION_BONANSAS_ID 
   = AGA.AUTORISATION_BONANSAS_ID
WHERE ? BETWEEN AG.DT_DEBUT AND AG.DT_FIN
  AND AG.ORGANISATION_ID = ?
  

Я попробовал и посмотрел, работает ли это.