【问题标题】:JPA-style Criteria/CriteriaBuilder queries from Hibernate Session来自 Hibernate Session 的 JPA 样式的 Criteria/CriteriaBuilder 查询
【发布时间】:2013-01-02 14:12:31
【问题描述】:

我有一个使用 Hibernate 4.x 的应用程序,它目前正在使用本机 Hibernate API(这意味着我有一个 SessionFactorySessions)。我只是 noticed 不推荐使用现有的 Criteria API 以支持 JPA 的(高级)Criteria API:

Hibernate 提供了一个旧的、遗留的org.hibernate.Criteria API,应该被视为已弃用。没有功能开发将针对这些 API。最终,特定于 Hibernate 的标准功能将被移植为 JPA javax.persistence.criteria.CriteriaQuery 的扩展。

我不想将我的应用程序转换为直接使用EntityManager(尽管很容易从那里获得 Hibernate Session),因为我们有大量的自定义 Hibernate 配置逻辑需要将被替代。尽管如此,我肯定想开始使用 JPA Criteria API,因为旧的 API 已被弃用(如果过去的 Hibernate 版本有任何迹象,可能会在未来的某个随机点消失)并且它们还提供了更好的类型安全性。

如果我使用的是 SessionFactory/Session,如何使用新的 CriteriaQuery/CriteriaBuilder API?

【问题讨论】:

  • 您目前的会话如何?它在中心位置吗?如果是这样,您应该能够更改它,以便从 EntityManager 获取会话,以便您可以访问 EM。问题是 Session 由 EntityManager 使用,而不是相反。但是如果你让你的更高级别使用 EntityManager 并从中获取会话(这样你就不会破坏旧代码)你会更好。
  • 它位于代码的中心部分,但我担心的部分原因是我们有一个非常复杂的配置系统来配置 Hibernate(以编程方式),我不确定我是否可以复制它JPA。如果不推荐使用 Hibernate 的 Criteria 以支持 JPA 的 Criteria,但无法从 Hibernate API 访问它,我预计他们也会弃用 Hibernate 配置 API(相反,看起来他们正在继续大规模构建休眠配置 API)
  • 没错,但您似乎无法以这种方式混合和匹配 JPA 和 Hibernate。即使你得到没有 EntityManager 的 CriteriaQuery 实例,你也需要一个 EM 来执行查询。

标签: hibernate jpa criteria-api


【解决方案1】:

我们的项目也有同样的困境。 项目真的很复杂:90%的实体都是动态生成的;在Hibernate标准API之上实现了API级别,重DAO和服务层,应用非常广泛;我们的 hibernate 版本经过多次修补以支持特定功能(如START WITH/CONNECT BYARRAY 输入 oracle 等); postgresql 和 oracle 都可以使用,或者等等。

新的 JPA API 对我们非常有用。我们需要能够在 Criteria API(而不是 HQL)级别使用函数(例如 NVL/coalesce 出于某种性能原因,substringtrim 等等)。 此外,我们需要 Hibernate Envers,它仅适用于“EntityManager”JPA 实现。

不幸的是,根据我们的研究结果,根本无法使用原生 Hibernate 中的 JPA Criteria API。 Envers 也不能用。 Hibernate 项目不断发展并获得新功能。 迁移到新的休眠版本对我们来说是非常复杂的任务。并且我们非常担心在迁移后无法使用新版本的许多新功能并随着这个基本框架的发展。

因此,我们考虑了两种可能的方式:使用 SQLCriterion 和自己的 Expressions 实现(使用 CriteriaQuery 解析列名并转换为 SQL)或迁移到“EntityManager”/CriteriaBuilder。第二种方式看起来是不可避免的。但是迁移到 JPA 实现带来了许多隐藏的问题,从而破坏了我们的项目。

如果我们选择迁移并且它会很有用,我将在这里留下我们将在此活动中遇到的问题。

【讨论】:

    猜你喜欢
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    相关资源
    最近更新 更多