首页 > 解决方案 > 由于参数异常,应用程序无法启动

问题描述

    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:“在字符 35 处遇到“JOIN”,但预期:[“SET”]。” 在解析 JPQL 时“更新 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” . 有关原始解析错误,请参阅嵌套堆栈跟踪。在 org.apache.openjpa.kernel.jpql.JPQLParser.parse(JPQLParser.java:54) 在 org.apache.openjpa.kernel.ExpressionStoreQuery.newCompilation(ExpressionStoreQuery.java:165) 在 org.apache.openjpa.kernel.QueryImpl .newCompilation(QueryImpl.java:718) 在 org.apache.openjpa.kernel.QueryImpl.compilationFromCache(QueryImpl.java: springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:87) ...省略了 96 个常见帧原因:org.apache.openjpa.persistence.ArgumentException:在字符 35 处遇到“JOIN”,但预期: [“放”]。在 org.apache.openjpa.kernel.jpql.JPQL.jj_consume_token(JPQL.java:13064) 在 org.apache.openjpa.kernel 的 org.apache.openjpa.kernel.jpql.JPQL.generateParseException(JPQL.java:13188) .jpql.JPQL.set_clause(JPQL.java:735) 在 org.apache.openjpa.kernel.jpql.JPQL.update_clause(JPQL.java:731) 在 org.apache.openjpa.kernel.jpql.JPQL.update_statement(JPQL .java:148) 在 org.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。

任何帮助表示赞赏。

编辑

从 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): 您不能在 FROM 子句中指定目标表 'm_appuser_logdetails' 进行更新

标签: javaopenjpa

解决方案


我看不出这JOIN FETCH部分的原因。
有什么东西阻止您使用以下内容吗?

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

推荐阅读