Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA2标准不区分重音,无数据库依赖关系_Java_Sql_Jpa_Jpa 2.0 - Fatal编程技术网

Java JPA2标准不区分重音,无数据库依赖关系

Java JPA2标准不区分重音,无数据库依赖关系,java,sql,jpa,jpa-2.0,Java,Sql,Jpa,Jpa 2.0,我在JPA2中使用本机查询来搜索不受大小写或重音影响的parcial文本(基于): public List findHipotesisByText(字符串srchtext){ EntityManager em=getEntityManager(); 字符串文本规范化= Normalizer.normalize(srchtext,Normalizer.Form.NFD); 查询= em.createNativeQuery( “从HIPOTESIS中选择*,如“%+textNormalized+”,

我在JPA2中使用本机查询来搜索不受大小写或重音影响的parcial文本(基于):

public List findHipotesisByText(字符串srchtext){
EntityManager em=getEntityManager();
字符串文本规范化=
Normalizer.normalize(srchtext,Normalizer.Form.NFD);
查询=
em.createNativeQuery(
“从HIPOTESIS中选择*,如“%+textNormalized+”,
Hipotesis(类);
@抑制警告(“未选中”)
List results=query.getResultList();
返回结果;
}
搜索文本被规范化为带重音符号,并转换为大写。 本机查询使用TRANSLATE将重音转换为纯文本,UPPER将结果转换为大写

因此,搜索文本eMeRgÊ将被规范化以出现,并将匹配数据库中的任何事件,如emergencia、eMeRgência、eMeRgência

尽管TRANSLATE是由SQL99指定的,但它不受支持或实现与标准完全相同


问题:有没有办法不使用TRANSLATE或不使用native query来实现此查询?

在我个人看来,最优雅的解决方案是实际复制数据并将其转换为规范化形式。在查询中使用了类似于的条件,这基本上排除了任何正常的查询(全文简称)索引机制。这意味着
翻译
查询很可能效率低下且难以优化

使用JPA,您可以使用实体生命周期事件以相当方便的方式管理规范化表单:

@Entity
public class Whatever implements Serializable {
    private static final long serialVersionUID = 0L;

    private String string;
    private String normalizedString;

    // getters and setters

    @PreUpdate
    @PrePersist
    protected void normalize() {
        normalizedString = yourNormalizationMethod(string);
    }
}

我认为这是解决这类问题的最干净、最优雅、最不依赖数据库的方法。

如果您计划以不区分大小写的方式进行搜索,并且不使用重音符号,则应在数据库中以小写(或大写,但只使用一个大小写)存储值没有重音。嗯,文本可以有重音和无重音复制,但我正在使用JPA搜索一个更优雅的解决方案,并且不涉及数据库。无论如何,如果你想允许索引查询,你必须使用上翻译函数进行索引…@SergeBallesta索引对查询条件几乎没有影响是像“%…%”一样的
@RobbyCornelissen:你说得对:-(。但作为一名前DB管理员,我一直希望开发人员在延迟过大和用户抱怨时使用索引……除非你需要同时在多个字段中搜索。
@Entity
public class Whatever implements Serializable {
    private static final long serialVersionUID = 0L;

    private String string;
    private String normalizedString;

    // getters and setters

    @PreUpdate
    @PrePersist
    protected void normalize() {
        normalizedString = yourNormalizationMethod(string);
    }
}