Java Hibernate 5中已弃用的createCriteria方法

Java Hibernate 5中已弃用的createCriteria方法,java,hibernate,Java,Hibernate,不推荐使用此调用: session.createCriteria(Bus.class).list(); 在源文件中,我可以看到以下内容: /** @deprecated */ @Deprecated Criteria createCriteria(Class var1); /** @deprecated */ @Deprecated Criteria createCriteria(Class var1, String var2); /** @deprecated */ @Deprecate

不推荐使用此调用:

session.createCriteria(Bus.class).list();
在源文件中,我可以看到以下内容:

/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1);

/** @deprecated */
@Deprecated
Criteria createCriteria(Class var1, String var2);

/** @deprecated */
@Deprecated
Criteria createCriteria(String var1);

/** @deprecated */
@Deprecated
Criteria createCriteria(String var1, String var2);

但我无法理解我必须使用哪种方法来代替API文档中的
createCriteria

@不赞成 条件createCriteria(类persistentClass) 不赞成。(从5.2开始)对于会话,使用JPA标准 为给定类(实体或子类/实现者)创建条件实例。 参数: persistentClass—类,它是一个实体,或具有实体子类/实现者 返回: 操作和执行的条件实例

所以它简单地说

使用JPA标准创建标准


您可以在Hibernate 5.2+中使用以下接口:

javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery

// Create CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();

// Create CriteriaQuery
CriteriaQuery<YourClass> criteria = builder.createQuery(YourClass.class);
javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery
//创建标准生成器
CriteriaBuilder=session.getCriteriaBuilder();
//创建标准查询
CriteriaQuery criteria=builder.createQuery(YourClass.class);

添加截至2018年3月的答案

依赖项:

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;

import javax.persistence.criteria.CriteriaQuery;
import java.util.List;



public static List<Contact> fecthAllContacts() {
        Session session = sessionFactory.openSession();

        // create Criteria
        CriteriaQuery<Contact> criteriaQuery = session.getCriteriaBuilder().createQuery(Contact.class);
        criteriaQuery.from(Contact.class);

        List<Contact> contacts = session.createQuery(criteriaQuery).getResultList();
        session.close();

        return contacts;
    }

我使用了以下方法,出于安全原因更改了对象名称:

public List<MyObject> listAllForIds(List<Long> ids) {
    Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(MyObject.class)
            .createAlias("joinObject", "joinObject")
            .add(Restrictions.not(Restrictions.like("name", "string1", MatchMode.END)))
            .add(Restrictions.not(Restrictions.like("name", "string2", MatchMode.END)))
            .add(Restrictions.in("joinObject.id", ids));

    return criteria.list();
}
查询如下所示:

public List<MyObject> listAllForIds(List<Long> ids) {

    CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<MyObject> criteria = builder.createQuery(MyObject.class);
    Root<MyObject> myObjectRoot = criteria.from(MyObject.class);
    Join<MyObject, JoinObject> joinObject = myObjectRoot.join("joinObject");

    Predicate likeRestriction = builder.and(
            builder.notLike( myObjectRoot.get("name"), "%string1"),
            builder.notLike( myObjectRoot.get("name"), "%string2")
    );

    criteria.select(myObjectRoot).where(joinObject.get("id").in(ids), likeRestriction);

    TypedQuery<MyObject> query = getSessionFactory().getCurrentSession().createQuery(criteria);

    return query.getResultList();
}
public List listAllForIds(列表id){
CriteriaBuilder=getSessionFactory().getCurrentSession().getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(MyObject.class);
Root myObjectRoot=标准.from(MyObject.class);
Join joinObject=myObjectRoot.Join(“joinObject”);
谓词likeRestriction=builder.and(
builder.notLike(myObjectRoot.get(“name”),“%string1”),
notLike(myObjectRoot.get(“name”),“%string2”)
);
选择(myObjectRoot).where(joinObject.get(“id”).in(ids),如限制);
TypedQuery query=getSessionFactory().getCurrentSession().createQuery(条件);
返回query.getResultList();
}

希望它能帮助其他人,请随时提出改进代码的建议。

hibernate版本???是否需要列出域对象的方法?如果是,请尝试
Bus.createCriteria()
谢谢!您能推荐我如何处理
休眠条件吗这里:
((角色)条件.add(Restrictions.eq(“name”),name)).uniqueResult()).getId()?您可以使用
标准查询where
方法。这里的更多信息:对于真实代码和完整示例:我正在将现有hibernate会话更改为JPA entity manager实例,并使用上面的建议答案更改所有createCriteria查询,但我遇到了一个语句,如c.setCacheable(true)和c.setCacheRegion(“generalCaache”),其中c是Criteria实例(以前)现在我把它改成了CriteriaQuery。CriteriaQuery的等效方法是什么?我正在将现有的hibernate会话更改为JPA实体管理器实例,并使用上面的建议答案更改所有createCriteria查询,但我遇到了一个语句,如c.setCacheable(true)和c.setCacheRegion(“generalCaache”),其中c是Criteria实例(以前)现在我把它改成了CriteriaQuery。CriteriaQuery方式中的等价物是什么?
javax.persistence.criteria.CriteriaBuilder
javax.persistence.criteria.CriteriaQuery
public List<MyObject> listAllForIds(List<Long> ids) {

    CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder();
    CriteriaQuery<MyObject> criteria = builder.createQuery(MyObject.class);
    Root<MyObject> myObjectRoot = criteria.from(MyObject.class);
    Join<MyObject, JoinObject> joinObject = myObjectRoot.join("joinObject");

    Predicate likeRestriction = builder.and(
            builder.notLike( myObjectRoot.get("name"), "%string1"),
            builder.notLike( myObjectRoot.get("name"), "%string2")
    );

    criteria.select(myObjectRoot).where(joinObject.get("id").in(ids), likeRestriction);

    TypedQuery<MyObject> query = getSessionFactory().getCurrentSession().createQuery(criteria);

    return query.getResultList();
}