Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-重写旧的createCriteria_Java_Hibernate - Fatal编程技术网

Java Hibernate-重写旧的createCriteria

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))

我有以下Hibernate代码:

        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方式中的等效语句是什么?