【问题标题】:Deprecated createCriteria method in Hibernate 5Hibernate 5 中不推荐使用的 createCriteria 方法
【发布时间】:2016-11-21 12:58:32
【问题描述】:

此调用已弃用:

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

但我不明白我必须使用哪种方法来代替createCriteria

【问题讨论】:

  • 休眠版????
  • 你需要列出域对象的方法吗?如果是这样,请尝试Bus.createCriteria()

标签: java hibernate


【解决方案1】:

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

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();
}

更改为使用:

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();
}

希望它对其他人有所帮助,请随时提出任何改进代码的建议。

【讨论】:

  • 我正在将我现有的休眠会话更改为 JPA 实体管理器实例,并使用上面建议的答案更改所有 createCriteria 查询,但我遇到了像 c.setCacheable(true) 和 c.setCacheRegion(" generalCaache"),其中 c 是 Criteria 实例(以前),我现在已将其更改为 CriteriaQuery。 CriteriaQuery 方式中的等价物是什么?
【解决方案2】:

您可以在 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);

【讨论】:

  • 谢谢!你能在这里推荐我如何处理hibernate criteria((Role) criteria.add(Restrictions.eq("name", name)).uniqueResult()).getId(); 吗?
  • 您可以使用CriteriaQuery&lt;T&gt; where 方法。更多信息:docs.oracle.com/cd/E19798-01/821-1841/gjivi/index.html
  • 我正在将我现有的休眠会话更改为 JPA 实体管理器实例,并使用上面建议的答案更改所有 createCriteria 查询,但我遇到了像 c.setCacheable(true) 和 c.setCacheRegion(" generalCaache"),其中 c 是 Criteria 实例(以前),我现在已将其更改为 CriteriaQuery。 CriteriaQuery 方式中的等价物是什么?
【解决方案3】:

添加截至 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;
    }

sessionFactory 是:

public static SessionFactory buildSessionFactory() {
        final ServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
        return new MetadataSources(registry).buildMetadata().buildSessionFactory();
    }

【讨论】:

    【解决方案4】:

    试试这个:

    cr.createCriteria("obj1", "obj1", JoinType.LEFT_OUTER_JOIN);
    

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 2012-02-09
      • 1970-01-01
      • 2012-01-27
      • 2017-06-19
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多