【问题标题】:NativeQuery with three single quotes带三个单引号的 NativeQuery
【发布时间】:2017-01-13 20:16:38
【问题描述】:

由于三个引号,我的查询失败。这可能是另一个原因,但据我所知,这是由三个引号引起的。我似乎无法找到解决方案,我需要额外的帮助。我尝试了转义和其他所有方法,但似乎无法解决问题。

我正在使用 Spring Data JPA

@Query(value = "SELECT f FROM Fragrance f WHERE REPLACE(REPLACE(f.name, ' &', ''), '' ', '') = ?1" , nativeQuery = true)
Fragrance findByNameIgnoreSpecialCharacters(String name);

错误

java.lang.IllegalArgumentException: Parameter with that position [1] did not exist
    at org.hibernate.jpa.spi.BaseQueryImpl.findParameterRegistration(BaseQueryImpl.java:502) ~[hibernate-entitymanager-5.0.11.Final.jar:5.0.11.Final]

【问题讨论】:

    标签: hibernate jpa spring-boot spring-data-jpa


    【解决方案1】:

    我无法在任何数据库上运行指定的本机查询,所以难怪 Hibernate 会发现它格式错误。

    指定查询

    SELECT
      f
    FROM
      Fragrance f
    WHERE
      REPLACE(REPLACE(f.name, ' &', ''), '' ', '') = ?1
    

    此查询中有两个错误。第一个错误是SELECT f FROM Fragrance f ... 要求在Fragrance 表中有一个名为f 的列,并且可能没有。请记住,这是本机查询而不是 JPA 查询。所以,正确的查询应该以SELECT * FROM Fragrance ...开头。

    第二个错误是'' ' 是查询的无效文本。 '' 表示单引号字符 (')。所以,这个文本没有正确开始。正确的文字应该是''' '

    正确查询

    SELECT
      *
    FROM
      Fragrance
    WHERE
      REPLACE(REPLACE(name, ' &', ''), ''' ', '') = ?1
    

    Sample working project 在 Github 上可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      相关资源
      最近更新 更多