JPA使用HQL时IN条件数组参数问题

当JPA执行以下代码

@Query(nativeQuery = true,
           countQuery = "select count(*) from TBL a  "
                + "where chan_ID in(  select chan_ID from tbl_nl where COMPANY_ID=:companyId AND chan_code_path like %:notifyType%) "
                + "and (( ENABLE_FLAG=1 and(( CONT_SCOPE=0) or ( CONT_SCOPE=1 and  COMPANY_ID=:companyId) or ( CONT_SCOPE=4 and  COMPANY_ID in(:cmpyIds)) "
                + "or  ( CONT_SCOPE=2 and TOP_DEPART_ID in(:deptIds)) "
                + "or ( CONT_SCOPE=3 and TOP_DEPART_ID=:topDeptId))))  "
                + "and (EXPIRE_TIME is NULL or (EXPIRE_TIME is not NULL and EXPIRE_TIME >= :dateStr)) order by CONT_SETTOP DESC ,CONT_TIME desc",
           value="select distinct * from TBL a  "
                + "where chan_ID in(  select chan_ID from tbl_nl where COMPANY_ID=:companyId AND chan_code_path like %:notifyType%) "
                + "and (( ENABLE_FLAG=1 and(( CONT_SCOPE=0) or ( CONT_SCOPE=1 and  COMPANY_ID=:companyId) or ( CONT_SCOPE=4 and  COMPANY_ID in(:cmpyIds)) "
                + "or  ( CONT_SCOPE=2 and TOP_DEPART_ID in(:deptIds)) "
                + "or ( CONT_SCOPE=3 and TOP_DEPART_ID=:topDeptId))))  "
                + "and (EXPIRE_TIME is NULL or (EXPIRE_TIME is not NULL and EXPIRE_TIME >= :dateStr)) "
                + "order by CONT_SETTOP DESC ,CONT_TIME DESC /*#pageable*/")
    Page<NotifyContent> findAllByCondition(@Param("companyId")Long companyId, @Param("deptIds")String deptIds, @Param("cmpyIds")String cmpyIds, 
            @Param("topDeptId")String topDeptId,@Param("notifyType") String notifyType, @Param("dateStr")String dateStr,  Pageable pageable);

报以下错误

2018-04-20 13:37:34.008  WARN 22309 --- [nio-7788-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1722, SQLState: 42000
2018-04-20 13:37:34.009 ERROR 22309 --- [nio-7788-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-01722: invalid number
2018-04-20 13:37:34.027 ERROR 22309 --- [nio-7788-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
java.sql.SQLSyntaxErrorException: ORA-01722: invalid number
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:208) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:886) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1175) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1296) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3613) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3657) ~[ojdbc6.jar!/:11.2.0.4.0]
        at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1495) ~[ojdbc6.jar!/:11.2.0.4.0]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]

分析错误:
deptIds和cmpyIds两个入参在in条件中,传输的是”214134,413241234”格式,但数据字段为number所以产生错误。
解决方法:
把IN条件中的拼接的字符串改为数组或List格式传入。如下:

@Query(nativeQuery = true,
           countQuery = "select count(*) from TBL a  "
                + "where chan_ID in(  select chan_ID from tbl_nl where COMPANY_ID=:companyId AND chan_code_path like %:notifyType%) "
                + "and (( ENABLE_FLAG=1 and(( CONT_SCOPE=0) or ( CONT_SCOPE=1 and  COMPANY_ID=:companyId) or ( CONT_SCOPE=4 and  COMPANY_ID in(:cmpyIds)) "
                + "or  ( CONT_SCOPE=2 and TOP_DEPART_ID in(:deptIds)) "
                + "or ( CONT_SCOPE=3 and TOP_DEPART_ID=:topDeptId))))  "
                + "and (EXPIRE_TIME is NULL or (EXPIRE_TIME is not NULL and EXPIRE_TIME >= :dateStr)) order by CONT_SETTOP DESC ,CONT_TIME desc",
           value="select distinct * from TBL a  "
                + "where chan_ID in(  select chan_ID from tbl_nl where COMPANY_ID=:companyId AND chan_code_path like %:notifyType%) "
                + "and (( ENABLE_FLAG=1 and(( CONT_SCOPE=0) or ( CONT_SCOPE=1 and  COMPANY_ID=:companyId) or ( CONT_SCOPE=4 and  COMPANY_ID in(:cmpyIds)) "
                + "or  ( CONT_SCOPE=2 and TOP_DEPART_ID in(:deptIds)) "
                + "or ( CONT_SCOPE=3 and TOP_DEPART_ID=:topDeptId))))  "
                + "and (EXPIRE_TIME is NULL or (EXPIRE_TIME is not NULL and EXPIRE_TIME >= :dateStr)) "
                + "order by CONT_SETTOP DESC ,CONT_TIME DESC /*#pageable*/")
    Page<NotifyContent> findAllByCondition(@Param("companyId")Long companyId, @Param("deptIds")List<Long> deptIds, @Param("cmpyIds")List<Long> cmpyIds, 
            @Param("topDeptId")String topDeptId,@Param("notifyType") String notifyType, @Param("dateStr")String dateStr,  Pageable pageable);

猜你喜欢

转载自blog.csdn.net/doegoo/article/details/80018464