具有自定义数据库功能的休眠标准

Posted

技术标签:

【中文标题】具有自定义数据库功能的休眠标准【英文标题】:Hibernate Criteria with custom database function 【发布时间】:2015-05-23 09:52:45 【问题描述】:

我正在使用 Hibernate 4 和 PostgreSQL 9。 我想使用如下所示的自定义 postgres 函数过滤行:

SELECT * FROM customer WHERE name % ?

(我使用的是 trigram 搜索,一个 postgres 扩展)。

要将此函数与session.CreateQuery() 一起使用,我在this tutorial 之后实现了我自己的SQLFunctionPostgreSQLDialect

该函数的工作原理如下:

session.createQuery("FROM Customer WHERE trgm_match(name, :name) = true");

现在进入困难的部分:

我需要使用几个搜索条件来查询表,并且想使用 Hibernate 的Criteria。我如何在criteria.add(Restrictions. ?? ); 中使用这个自定义 PostgreSQL 函数

我认为add( Restrictions.sqlRestriction("name % ?", filter, ??) ); 可能就足够了,但是我应该传递什么作为第三个参数? (该列的类型为VARCHAR

我经常看到 Hibernate.STRING 的用法,这在 Hibernate 4 中似乎不存在。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

也许您可以先尝试以Predicate 列表的形式创建一些限制。这是我的代码中的一个示例:

List<Predicate> predicates = new ArrayList<Predicate>();

//add predicates based on your business logic
if (model.getCreateDateFrom() != null)            
predicates.add(cb.greaterThanOrEqualTo(event.get(Event_.createDate), 
                    model.getCreateDateFrom()));

...
//add predicate utilizing your DB function
//0.00001111111 ~= 1 meter
if (model.getLatitude() != null)
    predicates.add(cb.equal(cb.function("is_point_inside_circle", Boolean.class, 
    cb.literal(model.getLatitude()), cb.literal(model.getLongitude()),
    event.get(Event_.latitude), event.get(Event_.longitude), 
    cb.literal(model.getRadius() * 0.00001111111)), true));

//set 'where' clause by converting list to array
cq.where(predicates.toArray(new Predicate[] ));

//perform query
//...

另请阅读:JPA Criteria api with CONTAINS function

【讨论】:

【参考方案2】:

我发现Hibernate.STRING 已弃用:Hibernate 4.1Final alternative for Hibernate.STRING

以下语句有效,但最好使用自定义限制类获得解决方案:

add(Restrictions.sqlRestriction("name % ?", filter, StringType.INSTANCE));

【讨论】:

以上是关于具有自定义数据库功能的休眠标准的主要内容,如果未能解决你的问题,请参考以下文章

具有自动完成功能的自定义表格可编辑数据

如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表

如何增加自定义的字段

将joomla的CMS功能用于自定义数据库表

带有连接的休眠自定义 SQL 查询 - 避免返回数组列表

如何添加自定义字段和引用