Java Hibernate-重写旧的createCriteria
我有以下Hibernate代码:Java Hibernate-重写旧的createCriteria,java,hibernate,Java,Hibernate,我有以下Hibernate代码: return (Post)sessionFactory.getCurrentSession() .createCriteria(Post.class) .add(Restrictions.eq("title", title)) .add(Restrictions.eq("description", description))
return (Post)sessionFactory.getCurrentSession()
.createCriteria(Post.class)
.add(Restrictions.eq("title", title))
.add(Restrictions.eq("description", description))
.uniqueResult();
但是方法createCriteria
已被弃用。如何将其重写为CriteriaQuery
,使代码保持最低限度,并且不使用CriteriaBuilder
文档建议在javax.Persistence.criteria
包下使用Jakarta Persistence API(JPA)类,无论我们在哪里使用Hibernate的SharedSessionContract.createCriteria(java.lang.Class)
method。事实上,所有方法,包括返回org.hibernate.Criteria
的方法createCriteria
的重载,都被弃用,这间接地意味着hibernate不希望我们再使用他们的org.hibernate.Criteria
接口。在5.4版中,没有实现类或扩展为标准
接口定义接口。简言之,用于充当标准
对象工厂的hibernate会话
不再生成它们,并且标准
可能在将来的版本中被完全弃用
其次,Hibernate在包org.Hibernate.Criteria
下提供了有用的API,例如限制、示例等。问题是,所有这些类似乎只有一个类型为org.Hibernate.Criteria
的使用者类,该类已被弃用。换句话说,如果您不能使用org.Hibernate.Criteria
,那么,您也不能使用org.hibernate.criteria.Restrictions
总之,如果您现在必须重构上述代码,那么您唯一的选择就是javax.persistence.criteria
下的内容。因此,您唯一的选择就是使用CriteriaBuilder
和CreateQuery
,如下所示
CriteriaBuilder cb = sessionFactory.getCurrentSession().getCriteriaBuilder();
// Create query
CriteriaQuery<Post> q = cb.createQuery(Post.class)
Root<Post> r = q.from(Post.class);
Predicate[] predicates = new Predicate[2];
predicates[0] = cb.equal(root.get("title"), title);
predicates[1] = cb.equal(root.get("description"), description);
q.select(r).where(predicates);
Query<Post> query = session.createQuery(q);
return query.getSingleResult();
CriteriaBuilder cb=sessionFactory.getCurrentSession().getCriteriaBuilder();
//创建查询
CriteriaQuery q=cb.createQuery(Post.class)
根r=q.from(后级);
谓词[]谓词=新谓词[2];
谓词[0]=cb.equal(root.get(“title”),title);
谓词[1]=cb.equal(root.get(“description”)、description);
q、 选择(r),其中(谓词);
Query Query=session.createQuery(q);
返回query.getSingleResult();
是的,与使用Hibernate API的原始代码相比,此代码非常冗长。但是,此代码提供的一个优点是,它现在与Hibernate特定的API解耦。因此,将来如果您想迁移到另一个JPA实现,您不必更改代码。我正在将现有的Hibernate会话更改为JPA entCity manager实例,我正在使用上面的建议答案更改所有createCriteria查询,但我遇到了一个语句,如c.setCacheable(true)和c.setCacheRegion(“generalCaache”),其中c是Criteria实例(以前),我现在已将其更改为CriteriaQuery。CriteriaQuery方式中的等效语句是什么?