eclipse学习(第三章:ssh中的Hibernate)——9.Hibernate里面的标准查询
作者:互联网
eclipse学习(第三章:ssh中的Hibernate)——9.Hibernate里面的标准查询
前言(建议看一下有版本差距)
本文参考自https://www.w3cschool.cn/hibernate/ugov1ie8.html后做的一个实践日志记录。
旧版本的话,你直接这么使用是没有任何问题的。
我这里举个最简单的例子吧,直接创建即可,如果就可以往里面添加参数处理了。
Criteria c = session.createCriteria(Address.class);
List<Address> l = c.list();
但是如果你换了版本,这个hibernate版本是在Hibernate5.2之后就会出现了已弃用的标志,要改为如下情况。
//创建CriteriaBuilder对象
CriteriaBuilder bulider = session.getCriteriaBuilder();
//创建对应实体类的CriteriaQuery对象
CriteriaQuery<Address> criteriaQuery = bulider.createQuery(Address.class);
//通过CriteriaQuery对象设置条件,这里是设置根条件
Root<Address> addressRoot = criteriaQuery.from(Address.class);
//通过session创建查询语句
Query q = session.createQuery(criteriaQuery);
//获取查询结果
List<Address> a = q.getResultList();
如果你使用已弃用的方法的话,会有这个输出
WARN: HHH90000022: Hibernate's legacy org.hibernate.Criteria API is deprecated; use the JPA javax.persistence.criteria.CriteriaQuery instead
我要说一句,这个标准查询是用来做查询处理的
标准查询
其实就是将一般的查询条件抽取成方法,替换了写hql的过程,其实都很类似的。不过我觉得写个hql其实比写这个好,起码省略了几行代码…
标准查询的部分示例说明
1、单条件查询(这里是使用新方法的)
新方法的话目前我就只能弄到这里了,抱歉,实力不够,弄不上去,其实还能弄一些更多示例的,不过看网址也行了https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#criteria-typedquery-entity
List<Address> addressList = null;
try {
transaction = session.beginTransaction();
//通过session获取CriteriaBuilder
CriteriaBuilder builder = session.getCriteriaBuilder();
//通过bulider创建查询语句
CriteriaQuery<Address> crQuery = builder.createQuery(Address.class);
//创建查询语句的根条件
Root<Address> addressRoot = crQuery.from(Address.class);
//查询语句中的设置查询主体
crQuery.select(addressRoot);
//以下是根据不同情况下做的一些处理
//查询studentId大于6的,gt是大于
// crQuery.where(builder.gt(addressRoot.get("studentId"), 6));
//查询studentId小于7的,lt是小于
// crQuery.where(builder.lt(addressRoot.get("studentId"), 7));
//查询studentId等于6的,equal是等于
// crQuery.where(builder.equal(addressRoot.get("studentId"), 6));
//模糊查询addressDetail以A省开头的列,like是模糊查询,一般与%和_一起使用
// crQuery.where(builder.like(addressRoot.get("addressDetail"), "A省%"));
//模糊查询addressDetail不为A省开头的列,like是模糊查询,一般与%和_一起使用
// crQuery.where(builder.notLike(addressRoot.get("addressDetail"),"A省%"));
//查询studentId在6-7之间的列,获取到的区间为:6<=x<=7
// crQuery.where(builder.between(addressRoot.get("studentId"), 6, 7));
//查询addressDetail不为空的列
// crQuery.where(builder.isNotNull(addressRoot.get("addressDetail")));
//查询addressDetail为空的列
crQuery.where(builder.isNull(addressRoot.get("studentId")));
//使用session执行自定义的查询语句
Query q = session.createQuery(crQuery);
//获取查询结果
addressList = q.getResultList();
transaction.commit();
2、单条件查询(使用已弃用方法)
旧方法处理,这里是做单条件处理,当然你写两条就代表and了,也可以充当多条件and处理,但是多条件建议还是使用下一个
List<Address> addressList = null;
try {
transaction = session.beginTransaction();
//创建Criteria,根据对应的实体类创建
Criteria criteria = session.createCriteria(Address.class);
//查询学生id大于7的列
// criteria.add(Restrictions.gt("studentId", 7));
//查询学生id大于等于7的列
// criteria.add(Restrictions.ge("studentId", 7));
//查询学生id小于7的列
// criteria.add(Restrictions.lt("studentId", 7));
//查询学生id等于7的列
// criteria.add(Restrictions.eq("studentId", 7));
//模糊查询addressDetail以A省开头的数据
// criteria.add(Restrictions.like("addressDetail", "A省%"));
//模糊查询addressDetail不以A省开头的数据
// criteria.add(Restrictions.ilike("addressDetail", "A省%"));
//查询学生id在6-7之间的内容,6<=x<=7
// criteria.add(Restrictions.between("studentId", 6, 7));
//查询学生id是否为空
criteria.add(Restrictions.isNull("studentId"));
//查询addressDetail是否为空
// criteria.add(Restrictions.isNull("addressDetail"));
addressList = criteria.list();
transaction.commit();
3、多条件查询(使用已弃用方法)
旧方法处理,这里是做多条件处理
List<Address> addressList = null;
try {
transaction = session.beginTransaction();
//创建Criteria,根据对应的实体类创建
Criteria criteria = session.createCriteria(Address.class);
//增加条件,一个是studentId=7一个是studentId=8
Criterion c1 = Restrictions.eq("studentId", 7);
Criterion c2 = Restrictions.eq("studentId", 8);
//这里使用or将上面条件组合起来
LogicalExpression or = Restrictions.or(c1,c2);
criteria.add(or);
//这里使用and将上面条件组合起来
// LogicalExpression and = Restrictions.and(c1,c2);
// criteria.add(and);
addressList = criteria.list();
transaction.commit();
4、分页处理(使用已弃用方法)
分页处理
List<Address> addressList = null;
try {
transaction = session.beginTransaction();
//创建Criteria,根据对应的实体类创建
Criteria criteria = session.createCriteria(Address.class);
//设置起始数据位置
criteria.setFirstResult(0);
//设置显示的数据量
criteria.setMaxResults(1);
addressList = criteria.list();
transaction.commit();
5、排序处理(使用已弃用方法)
排序处理
List<Address> addressList = null;
try {
transaction = session.beginTransaction();
//创建Criteria,根据对应的实体类创建
Criteria criteria = session.createCriteria(Address.class);
//根据provinces正序排列
criteria.addOrder(Order.asc("provinces"));
//根据studentId逆序排列
criteria.addOrder(Order.desc("studentId"));
addressList = criteria.list();
transaction.commit();
6、聚合处理(使用已弃用方法)
List<Object> addressList = null;
try {
transaction = session.beginTransaction();
//创建Criteria,根据对应的实体类创建
Criteria criteria = session.createCriteria(Address.class);
//查询一共多少条数据
// criteria.setProjection(Projections.rowCount());
//获取单个属性provinces
// criteria.setProjection(Projections.property("provinces"));
//求studentId的平均数
// criteria.setProjection(Projections.avg("studentId"));
//查询provinces去重后的数据
// criteria.setProjection(Projections.distinct(Projections.property("provinces")));
//查询provinces去重后有多少行
// criteria.setProjection(Projections.countDistinct("provinces"));
//查询studentId最大值
// criteria.setProjection(Projections.max("studentId"));
//查询studentId最小值
// criteria.setProjection(Projections.min("studentId"));
//查询studentId求和
criteria.setProjection(Projections.sum("studentId"));
addressList = criteria.list();
transaction.commit();
一些小知识
null和empty有什么区别呢?
这里有个null和empty的判断,null就是啥都没有才是null,"“不是null哦。但是empty包括了”"和啥都没有的情况。
项目地址
对应的建表语句也在里面了。
https://gitee.com/mrchen13427566118/ssh_hibernate_learn.git
里面的ssh_hibernate_standard_query。
如果你不知道如何打开,可以看这篇https://blog.csdn.net/weixin_43987277/article/details/116936221里面的第三点
标签:session,studentId,已弃,eclipse,查询,Hibernate,ssh,criteria,Criteria 来源: https://blog.csdn.net/weixin_43987277/article/details/117537187