【问题标题】:Bind @param in a Jpa repository native query inside single quotations在单引号内的 Jpa 存储库本机查询中绑定 @param
【发布时间】:2022-01-09 02:34:54
【问题描述】:

我正在寻找一种方法来在本机查询中绑定给定参数,其中值必须在单引号内,如下所示:

@Transactional(readOnly = true)
@Query(value = " SELECT c.ID " +
               " FROM table1 clh " +
               " LEFT JOIN table2 nks " +
               " on clh.SERIAL = nks.SERIAL_REF " +
               " WHERE clh.CREATED_DATE >= :now - interval ':timeThreshold' HOUR " +
               " AND nks.SERIAL_REF IS NULL" , nativeQuery = true)
List<Long> getIdsWithoutAnswer (@Param("timeThreshold") Integer timeThreshold, @Param("now") LocalDateTime now);

但是,当我尝试运行它时,它会导致 hibernate 无法绑定 timeThreshold 值,因为它是在单引号 '' 中提供的。

有谁知道如何解决这个问题?

【问题讨论】:

  • 您的 SQL 数据库是什么(例如 MySQL、Postgres、Oracle)?
  • 尝试删除引号。但我什至不确定你是否可以在那里有绑定变量?
  • @TimBiegeleisen 我在这种情况下使用 Oracle。
  • @SimonMartinelli 我试图删除单引号,但随后它抱怨在尝试运行查询时不是有效的语法。我也尝试将它作为字符串传递,无论是否带有单引号;也没有用:(

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

您在使用本机 Oracle 查询时遇到的问题与尝试将值绑定到区间文字有关。你不能那样做。相反,使用NUMTODSINTERVAL() 函数:

@Transactional(readOnly = true)
@Query(value = " SELECT c.ID " +
               " FROM table1 clh " +
               " LEFT JOIN table2 nks " +
               " on clh.SERIAL = nks.SERIAL_REF " +
               " WHERE clh.CREATED_DATE >= :now - numtodsinterval(:timeThreshold, 'hour') " +
               " AND nks.SERIAL_REF IS NULL" , nativeQuery = true)
List<Long> getIdsWithoutAnswer (@Param("timeThreshold") Integer timeThreshold, @Param("now") LocalDateTime now);

【讨论】:

  • 啊,我明白了——这似乎可以解决问题;谢谢。我还意识到另一种方法是通过从 LocalDateTime 属性中减去小时阈值来预先确定日期,然后简单地传递要与之比较的日期。
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多