当前位置: 首页 > 知识库问答 >
问题:

在spel中使用spring数据进行date数据类型的动态查询

谭勇
2023-03-14

我正在用spring数据创建一个带有空日期检查的spel动态查询。我的疑问是:

 @Query(nativeQuery = true, value = "select a.* from TABLE a where"
        + "(:#{#DateFrom} is null or a.F_DATE >= trunc(:#{#DateFrom}))")
List<Acc> getAccList(@Param("DateFrom") @Temporal(TemporalType.DATE) Date datefrom);

当我使用有效日期运行此查询时,它可以工作,但当我传递空日期时,我会得到以下错误:

堆栈跟踪:

Caused by: java.sql.SQLSyntaxErrorException: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
at com.ing.cbp.commons.util.logging.sql.LogablePreparedStatement.executeQuery(LogablePreparedStatement.java:77)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
... 78 common frames omitted

共有1个答案

端木令雪
2023-03-14

似乎oracle认为null值是一个二进制值,并且在尝试对其执行trunc时失败。选择日期应该会有帮助。因此得到的查询应该如下所示:

select a.* from TABLE a where (:#{#DateFrom} is null 
or a.F_DATE >= trunc(CAST(:#{#DateFrom} AS DATE))
 类似资料:
  • 我在ES上运行查询,但参数的数量正在增加(由于业务原因)。 根据Spring数据弹性搜索中的文档,您可以使用和有序参数,如,等,用于方法签名中给出的参数,但这种方法似乎有点不舒服 是否可以进行类似于的查询,换句话说,使用SpEL访问参数属性? 而不是以一系列参数的方法结束,比如 更像jpa使用的spring数据 或者是否有其他方法可以在不离开spring数据接口的情况下进行查询?

  • 我使用spring数据jpa,为了生成动态查询,我使用spring数据jpa规范。除了日期之外,它还能正常工作。我得到了以下例外: 但是我传入的参数值是java.util.Date类型。有什么理由? 以下是我的实体: 这里是 这引发了以下异常: 如果我格式化开始日期(formatter.format(开始日期))它抛出上述异常。

  • 我一直挣扎在这甚至在做了这么多的研究这么简单的事情,所以我需要一些帮助在这里。 我需要传递日期数据类型的当前日期,只有'yyyy-mm-dd'格式。SimpleDateFormat将当前日期转换为字符串类型,在尝试解析时,它将转换为日期类型,但会更改格式。 我需要日期类型的“YYYY-MM-DD”格式的currentDate。

  • 我有一个客户机正在发送列表 的usecase。任务是迭代并执行此函数,并将其保存在TypedSafeMap中。伪客户端代码: 在中,任务是执行这些函数并将其保存在TypedSafeMap中,其中键是函数结果类型的数据类型,值是函数的返回。apply(); 下面的代码

  • 我有三类,像故事,电影故事,照片 我想显示数据类别明智的数据从数据库 1.故事*data1*data2*data3 2.电影故事*data1*data2*data3 控制器: 型号: 查看: 数据库: 创建表home_page: 创建表(int(11)not NULLAUTO_INCREMENT,int(11)DEFAULT NULL,int(11)DEFAULT NULL,text,

  • 问题内容: 我以前从未将golang与mysql一起使用,因此我是 第一次阅读这些内容。我想做这样的事情: 这种输入太多了,尤其是当我想 将更多变量添加到WHERE条件中时。 如果这是PHP,我将执行以下操作: 通过使用foreach循环,我可以动态生成查询并根据需要动态绑定尽可能多的变量。 像golang和mysql这样的选项吗?还是有其他选择不对查询输入每个变量组合? 问题答案: 如果您的地图