在 Hibernate 中结合 NamedQuery 和 Criteria

Posted

技术标签:

【中文标题】在 Hibernate 中结合 NamedQuery 和 Criteria【英文标题】:Combine NamedQuery and Criteria in Hibernate 【发布时间】:2010-10-07 09:32:38 【问题描述】:

我在 storefinder 应用程序中使用 Hibernate。 对于 SQL 中的邻近搜索,我使用 hasrsine 公式。因为这是一个有点混乱的 SQL,我为此在我的 .hbm.xml 文件中创建了一个命名的 SQL 查询。

SELECT
    location.*,
    ( 3959 * acos( cos( radians(7.4481481) ) * 
      cos( radians( X(location.coordinates) ) ) *
      cos( radians( Y(location.coordinates) ) - radians(46.9479986) ) +
      sin( radians(7.4481481) ) * sin( radians( X(location.coordinates) ) ) ) )
    AS distance     
FROM
    location        
WHERE
    location.coordinates IS NOT NULL
HAVING
    distance < :radius
ORDER BY
    distance ASC
LIMIT :max

但我也有一个用户定义的过滤器(营业时间、分类等)。为此,我使用 Hibernate 标准以编程方式添加过滤器。

现在我有一个完美运行的 NamedQuery,它为我提供了某个点周围的所有位置,以及一个完美运行的条件查询,它根据某个过滤器为我提供了所有位置。

我的问题是:在 Hibernate 中结合这两种野兽的最佳方式是什么? (即,我需要满足某个过滤器的某个点周围的所有位置。)例如,有什么方法可以将 NamedQuery 用作条件搜索中的子查询?

【问题讨论】:

或者是否可以使用 Criteria 来表达邻近搜索?我当然可以忍受。我只是不知道该怎么做(即如何做相当于将haversine公式表达式添加到SELECT子句,然后在HAVING with Criteria中引用它)。 【参考方案1】:

在 Hibernate 中结合这两种野兽的最佳方式是什么?

据我所知,这是不可能的。因此,要么使用 Criteria 查询编写所有内容(我个人不知道如何执行您的要求),要么计算动态 HQL 字符串。

【讨论】:

我希望我可以避免动态字符串构建。但我想没有其他选择。如果 hibernate 以后支持这个就太好了!

以上是关于在 Hibernate 中结合 NamedQuery 和 Criteria的主要内容,如果未能解决你的问题,请参考以下文章

PostGreSQL 结合 Hibernate 在项目中的使用小结

Hibernate + Oracle 结合

Hibernate结合JPA05

JPA / Hibernate可以与其他持久性框架(如jOOQ)结合使用

为啥在迁移到 Hibernate 5.4.x 时 MappedSuperClass 注释与 @Inheritance 结合不再有效?

结合hibernate全文搜索和JPA查询