当前位置: 首页 > 知识库问答 >
问题:

来自Hibernate会话的JPA风格的Criteria/CriteriaBuilder查询

农建弼
2023-03-14

我有一个使用Hibernate 4.x的应用程序,它当前正在使用本机Hibernate API(这意味着我有一个sessionFactorysession)。我刚刚注意到,现有的标准API被弃用了,而支持JPA的(高级)标准API:

Hibernate提供了一个旧的、遗留的org.Hibernate.criteriaAPI,应该将其视为不推荐使用的API。任何特性开发都不会针对这些API。最终,特定于Hibernate的条件特性将作为JPAjavax.persistence.criteria.CriteriaAquery的扩展进行移植。

我不想将我的应用html" target="_blank">程序转换为直接使用EntityManager(尽管很容易从那里获得Hibernatesession),因为我们有大量的自定义Hibernate配置逻辑需要替换。尽管如此,我还是希望开始使用JPA标准API,因为旧的API已经被弃用了(如果过去的Hibernate版本可以说明问题,那么在将来可能会随机消失),而且它们还提供了更好的类型安全性。

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

共有1个答案

丌官丰羽
2023-03-14

我们的项目也有同样的困境。项目真的很复杂:90%的实体是动态生成的;在Hibernate标准API之上实现了API层、重DAO层和服务层,应用非常广泛;我们的hibernate版本经过多次补丁,以支持特定功能(如/通过连接、oracle中的数组类型等);同时使用postgresql和oracle,等等。

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

不幸的是,根据我们的研究结果,根本无法使用来自原生Hibernate的JPA标准API。Envers也不能使用。Hibernate项目正在不断发展并获得新的特性。迁移到新的hibernate版本对我们来说是非常复杂的任务。并且我们非常担心无法使用迁移后新版本的许多新特性并与这个基本框架一起成长。

因此,我们考虑了两种可能的方法:将SQLCriterial与自己的Expression实现一起使用(使用CriteriaQuery解析列名并转换为SQL),或者迁移到“EntityManager”/CriteriaBuilder。第二条路看起来是不可避免的。但是向JPA实现的迁移带来了许多隐藏的问题,这些问题破坏了我们的项目。

如果我们选择迁移并且它将是有用的,那么我将在这里留下我们将在本活动中挣扎的问题。

 类似资料:
  • 问题内容: 当尝试使用我创建类型查询时,出现以下别名问题。 我应该对以下代码进行哪些更改以获取计数? 限制条件: 我必须使用CriteriaBuilder / Query,因为必须根据值动态构建where子句。 我只需要COUNT,而不需要内存中的对象列表。 代码示例片段: 日志:我希望在所有where子句属性中使用generateAlias0而不是generateAlias1。 问题答案: 您的

  • 我有一个关于jpa中的子查询类的问题。我需要创建两个自定义字段的子查询,但是子查询没有多选方法,选择方法有表达式输入参数(在查询中这是选择)和配置方法不合适。 此外,我对联接子查询结果有疑问,是否可能?怎么做呢? 我有: 链延伸度 消息实体 查询包装 我需要创建这个查询(这是查询的一部分,我从谓词中获得的另一部分。JPQL不合适) 在子查询中我做 但是,子查询在params中没有带有Compoun

  • 问题内容: 我有这样的SQL语句: 因此,它为personID提供了“区别”行: 如果我有这样的表: 它会回来 现在,我尝试通过JPA CriteriaBuilder进行此操作。 我的第一个想法是子查询: 但这会产生错误 怎么对这个? 马可 问题答案: 我认为解决方案比看起来简单。您忘记了包含在CriteriaBuilder子查询中。以下代码执行您要查找的查询。 此代码将创建以下查询: 我认为您正

  • 目前,我正在为客户列表开发一个“过滤器”功能。 我有以下子查询,我不确定是否有办法用CriteriaBuilder构建它。它也可以在没有multiselect但是我需要、和来选择最小值。结果应该是一个数字。 例如客户余额表 更新:这是我当前的代码,但是 如何为我的子查询添加排序依据 如何设置maxResult 谢谢!B

  • 问题内容: 我已经打了一个拦截器将修复到现有project.the主要问题是,我一定会喜欢使用,并在照顾使用Hibernate实现JPA与会议现场(INSERT和UPDATE)。 原因? :需要进行此更改,因为有必要使用,而且我知道(因为我之前已经遇到过),liquibase使用默认的current_timestamp将时间戳转换为datetime,对于MySQL数据库来说太糟糕了。 所以我需要一

  • 我似乎无法让我的Spring JPA配置正常工作。我有一个Spring REST服务。如果我将所有实体设置为FetchType.EAGER,一切都按预期工作。但是我不想这样做,原因很明显。 当我将实体设置为FetchType时。懒惰,我得到以下错误: org.hibernate.LazyInitializationException:未能懒惰地初始化角色集合:com.service.entitie