Hibernate + Postgresql,不区分大小写搜索

时间:2010-02-08 04:29:07

标签: hibernate postgresql case-insensitive

我一直在谷歌搜索一个直接的解决方案,让我们的新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 个答案:

答案 0 :(得分:2)

在SQL中我以前玩过这个技巧,我认为在大多数RDBMS中都符合SQL标准:

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

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

答案 1 :(得分:0)

没有办法简单地tell Postgres to ignore case

如果更改需要进行此比较的所有列的类型是一个选项,请查看the citext datatype

答案 2 :(得分:0)

Spring可以很方便地配置如何将hibernate和postgres连接在一起,事务(如果需要)以及如何获取A 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片段。

答案 3 :(得分:0)

感谢您的回答;似乎没有一种简单的方法来解决数据库/ jdbc级别上的此问题。所以我们的解决方案是,尽管不是最佳的:

  1. 在逻辑数据中实施套管标准。
  2. 当我们收到客户端的请求时,请求字符串将通过toLowerCase()函数进行过滤。
  3. 当我们使用mysql时,只需要在my.cfg / ini中设置策略 - 我不明白为什么它在postgresql中变得更复杂。这是生活,虽然呃?