Java JPA2标准不区分重音,无数据库依赖关系
我在JPA2中使用本机查询来搜索不受大小写或重音影响的parcial文本(基于):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+”,
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);
}
}