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

4 回答 4

2

在 SQL 中,我以前玩过这个把戏,我相信这在大多数 RDBMS 中是符合 SQL 的:

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

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

于 2010-02-08T04:58:38.353 回答
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 部分。

于 2010-02-08T17:25:46.550 回答
0

没有办法只是简单地告诉 Postgres 忽略 case

如果可以选择更改需要此比较的所有列的类型,请查看citextdatatype

于 2010-02-08T12:48:29.947 回答
0

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

  1. 在逻辑数据中强制执行大小写标准。
  2. 当我们收到来自客户端的请求时,请求字符串会通过 toLowerCase() 函数进行过滤。

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

于 2010-02-10T22:47:43.647 回答