微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JDBI/Postgress Select 查询失败,日期时间比较

如何解决JDBI/Postgress Select 查询失败,日期时间比较

Postgress 版本:10.4

表列名/类型:updated_at timestamp(6) with time zone

sql 查询

final String SELECT_PAYMENT_INFO_QUERY =
    "SELECT i.code,p.* 
    FROM information i 
    INNER JOIN product p ON i.ref = p.information_ref 
    WHERE p.reference = :reference AND p.type = :paymentMethodType AND p.error_state = :errorState 
    AND p.updated_at IS NOT NULL AND p.updated_at >= :queryFromTime 
    ORDER BY p.updated_at ASC 
    FETCH FirsT :numberOfRows ROWS ONLY"

Java 方法

    public List<ProductinformationDTO> retrieveProductinformations(
      zoneddatetime fetchFromTime,int noOfRecords)
  {
    try
    {
      return dbi.inTransaction((HandleCallback<List<ProductinformationDTO>,Exception>) handle ->
      {
        final List<ProductinformationDTO> productInfos = handle.createquery(SELECT_PAYMENT_INFO_QUERY)
            .bind("reference","ABCD")
            .bind("paymentMethodType","CREDIT_CARD")
            .bind("errorState","COMPLETED_WITH_ERRORS")
            .bind("queryFromTime",fetchFromTime.toOffsetDateTime())
            .bind("numberOfRows",noOfRecords)
            .map(productInfoMapper)
            .list();

        return productInfos;
      });
    }
    catch (Exception e)
    {
      LOG.error("Failed to complete the retrieve operation.",e);
      throw new TransactionException(e);
    }
  }

查询方法适用于 H2 数据库。但是,当它使用 Postgress 数据库进行测试时,我得到以下异常

org.jdbi.v3.core.statement.UnabletoExecuteStatementException:org.postgresql.util.PsqlException:错误:语法错误在“$5”或附近 位置:234 [语句:“SELECT i.code,p.* FROM information i INNER JOIN product p ON i.ref = p.information_ref WHERE p.reference = :reference AND p.type = :paymentMethodType AND p.error_state = : errorState AND p.updated_at IS NOT NULL AND p.updated_at >= :queryFromTime ORDER BY p.updated_at ASC FETCH FirsT :numberOfRows ROWS ONLY”,参数:{positional:{},命名为:{queryFromTime:2021-04-15T16:28 :20.365795+12:00,numberOfRows:10,paymentMethodType:CREDIT_CARD,reference:ABCD,errorState:COMPLETED_WITH_ERRORS},finder:[]}] 在 org.jdbi.v3.core.statement.sqlStatement.internalExecute(sqlStatement.java:1794) 在 org.jdbi.v3.core.result.ResultProducers.lambda$getResultSet$2(ResultProducers.java:64) 在 org.jdbi.v3.core.result.ResultIterable.lambda$of$0(ResultIterable.java:54) 在 org.jdbi.v3.core.result.ResultIterable.stream(ResultIterable.java:228) 在 org.jdbi.v3.core.result.ResultIterable.collect(ResultIterable.java:284) 在 org.jdbi.v3.core.result.ResultIterable.list(ResultIterable.java:273) 在 au.com.abcd.products.v2.database.store.dao.ProductsDaoImpl.lambda$retrieveProductinformations$6(ProductsDaoImpl.java:260) 在 org.jdbi.v3.core.Handle.inTransaction(Handle.java:424) 在 org.jdbi.v3.core.jdbi.lambda$inTransaction$4(jdbi.java:375) 在 org.jdbi.v3.core.jdbi.withHandle(jdbi.java:341) 在 org.jdbi.v3.core.jdbi.inTransaction(jdbi.java:375) 在 au.com.abcd.products.v2.database.store.dao.ProductsDaoImpl.retrievePaymentIntents(IntentDaoImpl.java:251) 在 au.com.abcd.products.v2.business.services.complete.ProductServiceImpl.reProcessproducts(ProductServiceImpl.java:114) 在 au.com.abcd.products.v2.business.background.TransactionReProcessManager.lambda$reProcessproducts$1(TransactionReProcessManager.java:81) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:829) 引起:org.postgresql.util.PsqlException:错误:“$5”处或附近的语法错误 职位:234 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2532) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2267) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:312) 在 org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448) 在 org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369) 在 org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:153) 在 org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:142) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) 在 org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114) 在 com.sun.proxy.$Proxy120.execute(来源不明) 在 org.jdbi.v3.core.statement.sqlLoggerUtil.wrap(sqlLoggerUtil.java:31) 在 org.jdbi.v3.core.statement.sqlStatement.internalExecute(sqlStatement.java:1786) ...省略了 16 个常用帧

我也尝试过 fetchFromTime.toLocalDateTime() 但得到同样的异常。

解决方法

您不能在 FETCH FIRST(或 LIMIT)子句中使用位置参数。一种解决方法(假设您可以容忍运行本机查询)是改用 ROW_NUMBER

SELECT *
FROM
(
    SELECT i.code,p.*,ROW_NUMBER() OVER (ORDER BY p.updated_at) rn
    FROM information i 
    INNER JOIN product p ON i.ref = p.information_ref 
    WHERE p.reference = :reference AND p.type = :paymentMethodType AND
          p.error_state = :errorState AND p.updated_at IS NOT NULL AND
          p.updated_at >= :queryFromTime 
) t
WHERE rn <= :numberOfRows

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。