具有自定义数据库功能的Hibernate Criteria

时间:2015-05-23 09:52:45

标签: java hibernate postgresql

我正在使用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中似乎不存在的用法。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分: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
//...

另请阅读:http://generatewp.com

答案 1 :(得分:0)

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

以下声明有效,但使用自定义限制类获得解决方案会更好:

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