Приложение не запускается из-за исключения аргумента - PullRequest
0 голосов
/ 21 февраля 2020
    public interface AppUserLoginHistoryRepository
        extends JpaRepository<AppUserLoginHistory, Long>, JpaSpecificationExecutor<AppUserLoginHistory> {

    @Query("UPDATE AppUserLoginHistory logdet"
       + " JOIN FETCH (SELECT MAX(DISTINCT loginSystemDate) AS loginDate FROM AppUserLoginHistory WHERE tlr = :username) logdet2"
       + " ON logdet.loginSystemDate = logdet2.loginDate SET logdet.logoutComputerDate = :logoutDate, logdet.forcedLogout = :isForcedLogout")
    @Modifying
    void updateAppUserLogout(@Param("logoutDate") Date logoutDate, @Param("isForcedLogout") boolean isForcedLogout, @Param("username") String username);

}

Я получаю ошибку ниже из приведенных выше фрагментов

Вызывается: org. apache .openjpa.persistence.ArgumentException: "Обнаружено" JOIN "в символе 35, но ожидается: ["НАБОР"]." при синтаксическом анализе JPQL «UPDATE AppUserLoginHistory logdet» СОВМЕСТНАЯ ВЫБОРКА (ВЫБРАТЬСЯ НА ВЫБОР) , См. Трассировку вложенного стека для оригинальной ошибки разбора. в орг. apache .openjpa.kernel.jpql.JPQLParser.parse (JPQLParser. java: 54) в орг. apache .openjpa.kernel.ExpressionStoreQuery.newCompilation (ExpressionStoreQuery. java: 165) или . apache .openjpa.kernel.QueryImpl.newCompilation (QueryImpl. java: 718) в org. apache .openjpa.kernel.QueryImpl.compilationFromCache (QueryImpl. java: 692) в org. apache .openjpa.kernel.QueryImpl.compileForCompilation (QueryImpl. java: 659) в org. apache .openjpa.kernel.QueryImpl.compileForExecutor (QueryImpl. java: 728) в org. apache .openjpa. .QueryImpl.compile (QueryImpl. java: 627) в орг. apache .openjpa.persistence.EntityManagerImpl.createQuery (EntityManagerImpl. java: 1168) в орг. apache .openjpa.persagerImplIm (EntityManagerImpl. java: 1149) в sun.reflect.GeneratedMethodAccessor219.invoke (неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник) в java .lang.reflect.Method.invoke ( org.springframework.orm.jpa.ExtendedEntityManagerCreator $ Exte ndedEntityManagerInvocationHandler.invoke (ExtendedEntityManagerCreator. java: 368) в com.sun.proxy. $ Proxy344.createQuery (Неизвестный источник) в org.springframework.data.jpa.repository.query.SimpleJpaQuery. 87) ... 96 общих кадров опущено. Причины: org. apache .openjpa.persistence.ArgumentException: Обнаружен «JOIN» в символе 35, но ожидается: [«SET»]. в орг. apache .openjpa.kernel.jpql.JPQL.generateParseException (JPQL. java: 13188) в орг. apache .openjpa.kernel.jpql.JPQL.jj_consume_token (JPQL. java: 13064) в орг. apache .openjpa.kernel.jpql.JPQL.set_clause (JPQL. java: 735) в орг. apache .openjpa.kernel.jpql.JPQL.update_clause (JPQL. java: 731) в орг. apache .openjpa.kernel.jpql.JPQL.update_statement (JPQL. java: 148) в орг. apache .openjpa.kernel.jpql.JPQL.parseQuery (JPQL. java: 66) в org. apache .openjpa.kernel.jpql.JPQLExpressionBuilder $ ParsedJPQL.parse (JPQLExpressionBuilder. java: 2439) в org. apache .openjpa.kernel.jpql.JPQLExpressionBilder $Jp. : 2426) в орг. apache .openjpa.kernel.jpql.JPQLParser.parse (JPQLParser. java: 51) ... 110 пропущенных общих кадров

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ

С SQL Я пробовал запрос с предложением WHERE, как показано ниже.

UPDATE m_appuser_logdetails
   SET logout_computer_date = '2021-02-20 13:12:09'
 WHERE login_computer_date = (SELECT MAX(DISTINCT login_computer_date)
                                FROM m_appuser_logdetails)
   AND user_id=1 LIMIT 1

, но я получаю ошибку

SQL Ошибка (1093): вы не можете указать целевую таблицу 'm_appuser_logdeta ils 'для обновления в предложении FROM

1 Ответ

1 голос
/ 21 февраля 2020

Я не вижу причины для JOIN FETCH детали.
Что-то мешает вам использовать следующее?

UPDATE AppUserLoginHistory logdet
SET logdet.logoutComputerDate = :logoutDate
   ,logdet.forcedLogout = :isForcedLogout
...