【问题标题】:JPA @Query with LIKE and UPPER %JPA @Query 与 LIKE 和 UPPER %
【发布时间】:2022-01-13 16:50:58
【问题描述】:

我正在尝试在 JPA hibernate @Repostiory 中运行以下查询:

@Query(value = "select city, state_code " +
          "from mv_city_state_center " +
          "where upper(city) like upper(:citycriteria)%",
          nativeQuery = true)
List<String> searchCityStateCenter(@Param("citycriteria") String cityCriteria);

特别是like upper(:citycriteria)%这一行。

citycriteria 是像'pit' 这样的部分字符串,我想先将其大写为PIT,然后将其放入like 语句中,例如。 where upper(city) like PIT% - 例如匹配 PITTSBURGH 和 PITTCARN。

Hibernate 接受 like pit%,但当 upper 被混合使用时,两者都失败:

  • like upper(:citycriteria)%
  • like upper(:citycriteria%)

正确的语法是什么?目前,我确保所有调用方方法都只传递cityCriteria.toUpperCase(),但如果查询本身处理了这个问题,那么调用方不必关心它。

我也尝试了类似下面from this guide 的方法,但无济于事。

public interface AuthorRepository extends JpaRepository<Author, Long> {
 
    @Query("FROM Author WHERE UPPER(firstName) LIKE %?#{[0].toUpperCase()}%")
    List<Author> findByFirstNameContainingIgnoreCase(String firstName);
}

【问题讨论】:

  • 我认为您需要修复连接字符串中的间距。例如 state_codefrom 会在 1 个单词中粘在一起。
  • 我更新了,谢谢你的提示

标签: java spring hibernate jpa


【解决方案1】:

1 您正在使用本机查询,为什么?

2 您返回一个列表,但投影有两列(城市、州代码)!

要连接两个字符串,您可以使用 concat:

@Query(value = "select city, state_code " +
          "from mv_city_state_center " +
          "where upper(city) like upper(concat(:citycriteria, '%'))"
          nativeQuery = true)
List<String[]> searchCityStateCenter(@Param("citycriteria") String cityCriteria);

【讨论】:

  • 谢谢 - 这工作。我不太明白为什么foo%concat('foo', '%') 不同,但很高兴它有效!回答你的问题:1)项目中的其他查询是这样的,所以保持约定,如果查询不在 SQL 中,我发现很难对查询进行故障排除。想象一下,一个大型查询失败了——首先我必须将它翻译成 SQL,然后在我的 IDE 中运行它。这真的很乏味,所以值得我权衡通用性......和2)这些返回CSV连接的字符串,如“foo,bar,baz” - 然后用户界面期望它那样,所以我只是保持conevntion。
  • 如果你使用 SQL 你应该试试 jooq:jooq.org
  • 我确实返回并将这些更改为不是原生查询, - 再次感谢您的帮助。
猜你喜欢
  • 2020-11-26
  • 1970-01-01
  • 2021-10-16
  • 2014-08-31
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多