Hibernate 5中不推荐使用createCriteria方法
此调用已弃用:
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
。
您可以在Hibernate 5.2 +中使用以下界面:
javax.persistence.criteria.CriteriaBuilder javax.persistence.criteria.CriteriaQuery // Create CriteriaBuilder CriteriaBuilder builder = session.getCriteriaBuilder(); // Create CriteriaQuery 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 fecthAllContacts() { Session session = sessionFactory.openSession(); // create Criteria CriteriaQuery criteriaQuery = session.getCriteriaBuilder().createQuery(Contact.class); criteriaQuery.from(Contact.class); List 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(); }
我有以下方法,出于安全原因更改了对象名称:
public List listAllForIds(List 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 listAllForIds(List ids) { CriteriaBuilder builder = getSessionFactory().getCurrentSession().getCriteriaBuilder(); CriteriaQuery criteria = builder.createQuery(MyObject.class); Root myObjectRoot = criteria.from(MyObject.class); Join 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 query = getSessionFactory().getCurrentSession().createQuery(criteria); return query.getResultList(); }
希望它可以帮助其他人,请随时建议任何改善代码的渠道。
来自API文档:
@Deprecated Criteria createCriteria(Class persistentClass)已过时。 (自5.2起)对于Session,使用给定类(实体或子类/实现者)的JPA Criteria Create Criteria实例。 参数:persistentClass – 类,它是一个实体,或者具有实体子类/实现者返回:操作和执行的条件实例
所以它简要地说……
使用JPA Criteria Create Criteria
- Criteria API返回的结果集太小
- Hibernate:按示例查询涉及一对多关系
- 在Spring 3之前注入Hibernate会话的最佳方法
- JPA:如何映射SQL Server uniqueidentifier类型
- JPA SQL Server没有JDBC类型的Dialect映射:-9
- 如何使用JPA解决javax.persistence.EntityNotFoundException(而不是使用@NotFound)
- Hibernate hbm2ddl.auto默认值
- 如何使用Hibernate / JPA2实现Spring Security用户/权限?
- java.lang.ClassCastException:java.lang.Long无法在java 1.6中强制转换为java.lang.Integer