使用Hibernate和Postgresql进行大小写不敏感的搜索

5

我一直在谷歌上搜索如何让我们的新postgresql+hibernate设置支持不区分大小写的搜索,但是没有找到简单明了的解决方案。我们之前使用的是mysql,它有一个不区分大小写搜索的策略,但是Postgresql似乎缺少这个功能。

例如,我希望Hibernate/Postgresql对以下每个查询都返回相同的结果:

SELECT * FROM Foo where bar = 'Hello World';

并且

SELECT * FROM Foo where bar = 'hello wOrlD';

我找到的唯一解决方案是在生成的查询语句中嵌入“ilike”关键字。但是,你可能认为Hibernate中应该有某种配置可以满足这个需求?我对Hibernate和Postgresql的经验有限,所以非常感谢任何建议。

谢谢

4个回答

2

我之前在SQL中使用过一个技巧,我相信在大多数关系型数据库管理系统中都符合SQL标准:

SELECT * FROM UPPER(bar) = 'HELLO WORLD'

在传递参数之前,您可以将其大写。这可能与在Hibernate查询中使用Restrictions.ilike() criteria相同。


谢谢Matt,听起来很有趣。不好意思,我应该提到我们也在使用Spring来配置Hibernate。再次说明,我对这些框架还是比较新的,但你知道是否可以在applicationContext中设置任何属性来将此限制默认设置吗? - Blaskowitz

1

Spring在配置诸如如何连接Hibernate和Postgres、事务(如果需要)以及如何获取HibernateSession对象等方面非常方便。实际上,使用Spring,您可以使用HibernateTemplates(一个Spring对象),它将为您代理很多东西。

但是,您仍然可以编写查询的程序。在这种情况下,使用HibernateTemplate,您可以编写:

String parameter = "hello wOrlD"
DetachedCriteria criteria = DetachedCriteria.forClass(objectClass)
                             .add(Restrictions.ilike("name", parameter)));
List<Object> result = template.findByCriteria(criteria);

或者你可以考虑使用Restrictions.eq或sqlRestriction来实现它的SQL部分。


0

没有一种简单的方法可以让Postgres忽略大小写

如果更改需要进行比较的所有列的类型是一个选项,那么请查看{{link2:citext数据类型}}。


0

感谢你们两位的回答;在数据库/JDBC层面上似乎没有简单的方法来解决这个问题。因此,我们的解决方案虽然不是最优的:

  1. 强制规范逻辑数据的大小写。
  2. 当我们从客户端收到请求时,请求字符串会通过toLowerCase()函数进行过滤。

当我们使用mysql时,只需要在my.cfg/ini中设置一个策略即可 - 我不明白为什么在postgresql中变得更加复杂了。生活就是这样吧?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接