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

标签 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 中似乎不存在。

如有任何帮助,我们将不胜感激。

最佳答案

也许您可以先尝试以 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

关于java - 具有自定义数据库功能的 Hibernate Criteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411283/

相关文章:

java - 在 OneToMany 中使用 Hibernate 持久保存对象

postgresql - 如何在程序内创建 View 内使用变量?

sql - PostgreSQL 中的交叉表查询

java - 如何打印变量

java - 解决 Java 中的传递依赖冲突

java - 如何将 Ruby on Rails 编写的网站与 Android 应用程序连接到使用 Postgresql 的 Heroku 上托管的相同数据库

java - Gson toJson(),奇怪的行为(产生空的 json)

java - Spring Security中错误的自定义设计用户/权限

java - 什么是 Hibernate 业务对象? DTO?

python - 使用 .format() 时出现 psycopg2 编程错误