【问题标题】:Spring Data JPA - escape accent french character (é, à, è, û..)Spring Data JPA - 转义重音法语字符(é、à、è、û..)
【发布时间】:2018-08-28 06:59:46
【问题描述】:

我正在使用 Spring Data JPA 方法名称查询进行 SQL 查询,例如 findByNameContains(String name) 来查找名称中包含给定字符串的所有实体。但它只适用于精确字符。我想知道如果用户输入é,如何返回名称包含字符é 及其基本字符e 的所有实体。谢谢。

【问题讨论】:

  • 数据库中是否有特殊字符,或者只是来自用户的输入?
  • 除了你正在使用什么 rdbms?
  • 是的,我希望英文字符及其变体在搜索过程中可以互换。我的数据库中有MontrealMontréal,当用户输入MontrealMontréal 时,我想返回这两个名称。
  • 我正在使用 PostgreSQL

标签: java postgresql spring-data-jpa


【解决方案1】:

我认为 Spring Data 中不存在此功能。

因为您使用的是 PostgreSQL,所以您可以使用 unaccent Extension 它可以在您的情况下为您提供帮助,除了您必须像这样创建 本机自定义查询

PostgresSQL

@Query(nativeQuery = true, value = "SELECT * FROM schema_name.table_name "
                                 + "WHERE unaccent(col_name) = unaccent(:name)")
public List<EntityName> find(@Param("name") String name);

注意:您必须在您的数据库中启用此unaccent 扩展:

CREATE EXTENSION unaccent;

MySQL

使用 MySQL 的可以使用collate utf8_bin 像这样:

@Query(nativeQuery = true, value = "SELECT * FROM table_name "
                                 + "WHERE col_name = :name collate utf8_bin")
public List<EntityName> find(@Param("name") String name);

SQL 服务器

使用 Oracle 的可以使用collation

@Query(nativeQuery = true, value = "SELECT * FROM table_name WHERE "
        + "name COLLATE Latin1_general_CI_AI Like :name COLLATE Latin1_general_CI_AI")
public List<EntityName> find(@Param("name") String name);

参考资料:

【讨论】:

  • 非常感谢您的示例。我成功将findAllByNameStartingWithIgnoreCaseOrderByName 转换为@Query(nativeQuery = true, value = "SELECT * FROM public.city " + "WHERE upper(unaccent(city_name)) LIKE upper(unaccent(:name) || '%')")
  • 你熟悉spring batch吗?我还有一个关于春季批处理中跳过 JDBC 异常的问题here
  • @JasminDan 待会再看,有想法再分享给大家
  • 如果您想使用 Pageable 限制结果怎么办?
  • @Kikin-Sama 我有空的时候会检查这个:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 2016-11-13
  • 2012-06-17
  • 2020-05-05
  • 1970-01-01
相关资源
最近更新 更多