Hibernate在检索数据上,可以使用SQL、HQL和官方API进行查询,本人主要利用API进行相关查询的小demo。

话不多少直接上demo。

demo1:基本查询

    /**
* 默认不加任何条件的时候是搜索全部。()
* @param session
*/
private static void demo1(Session session) {
//criteria 是条件的意思
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
//idEq()是根据id进行匹配,gt()大于,lt()小于,in()在其中...
criteria.add(Restrictions.idEq(4));
List<StuInfo> infos = criteria.list();
for (StuInfo stuInfo : infos) {
System.out.println(stuInfo);
}
}

说明:

1.关键需要掌握Restrictions的几个方法 eq,lt,gt... ,此类似于jQuery。

demo2:模糊查询

    /**
* 模糊查询
* notice:普通的大于小于等的查询使用的是条件Restrictions
* @param session
*/
private static void demo2(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
criteria.add(Restrictions.like("stuName", "%刘%"));
List<StuInfo> list = criteria.list();
System.out.println(list.size());
}

说明:

1.模糊查询使用like,使用%作为模糊条件。

2.直接使用HQL的模糊查询是在设置参数的时候进行拼接的,使用API不许如此,使用HQL的查询总结如下。

String hql = "From StudentEntity as s where s.id= ? or s.stuName like ?";
List<StudentEntity> lists = getSession().createQuery(hql).setString(0, "%" + param + "%").setString(1, "%" + param + "%").list();

demo3:基本查询

/**
* 关联查询
* notice:利用createAlias来新建关联,翻译成SQL就是inner join,需要注意的是session中对应的那个类需要有一个字段叫做被关联的名称。
* ps:实现原理是这样的:被关联的类的id作为外键ID,然后根据实体类的映射关系找到当前实体类的外键字段。
* @param session
*/
private static void demo4(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
// 词句代码是关键:表示引入stuClass这个类。notice:stuClass此字段必须存在在StuInfo这个类中。
criteria.createAlias("stuClass", "cls");
criteria.add(Restrictions.eq("cls.classId", 1)).add(Restrictions.gt("stu.stuId", 70));
List<StuInfo> lists = criteria.list();
for (StuInfo stuInfo : lists) {
System.out.println(stuInfo);
}
}

说明:

1.关联查询是API查询的最大优点之一,只要"主类"中有对应的外键类的参数,那么就可以通过  createAlias(外键对象名,别名) 进行关联。

2.其内部使用的是 outer join 通过主类中外键对象的id相同进行关联的。

demo4:排序

    /**
* 排序
* Order.desc("propertyName") 或者 Order.asc("propertyName")
* @param session
*/
private static void demo5(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
criteria.add(Restrictions.gt("stu.stuId", 30));
     //addOrder()方法排序,通过Order.asc(id)或者Order.desc(id)进行相应排序
criteria.addOrder(Order.desc("stu.stuId"));
List<StuInfo> list = criteria.list();
for (StuInfo stuInfo : list) {
System.out.println(stuInfo);
}
}

说明:

1. 见绿色注释

demo5:条件OR查询

    /**
* or
* Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
* @param session
*/
private static void demo6(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
     //or(条件1,条件2,...)不同的or条件通过逗号进行分割
criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
List<StuInfo> list = criteria.list();
for (StuInfo stuInfo : list) {
System.out.println(stuInfo);
}
}

demo6:聚合函数1

/**
* or
* Restrictions.or(ex1,ex2,ex3);均表示的是多个条件依次or
* @param session
*/
private static void demo7(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
//notic:Restriction就是普通的条件直接add就可以了
criteria.add(Restrictions.or(Restrictions.gt("stu.stuId", 20), Restrictions.lt("stu.stuId", 70)));
//notice:Projection在设置的使用需要使用setProjection
criteria.setProjection(Projections.projectionList().add(Projections.avg("stuId")).add(Projections.rowCount())); List<StuInfo> list = criteria.list();
for (StuInfo stuInfo : list) {
System.out.println(stuInfo);
}
}

说明:

1. 普通的基本条件使用的是Restriction,但是聚合函数使用的是Projection。

2. 聚合函数在添加条件的时候,需要使用criteria.setProjection(Projections.projectionList().add(xxx).add(xxx))进行处理。

demo7:聚合函数之别名排序

/**
* Projection作为同Restriction的一个条件,用在"聚合函数"和"投影"上
* 两种办法:一种是利用as,一种是利用逗号分隔。
*
* @param session
*/
private static void demo8(Session session) {
Criteria criteria = session.createCriteria(StuInfo.class, "stu");
//对于普通的条件Restriction相关的就是直接add,但是对于Projections若要链式添加,需要使用 Projections.projectionList().add().add()
criteria.setProjection(Projections.projectionList().add(Projections.rowCount())
.add(Projections.max("stu.stuId").as("max"))
.add(Projections.alias(Projections.min("stu.stuId"), "min"))
.add(Projections.groupProperty("stu.stuClass")));
criteria.addOrder(Order.desc("min"));
//需要注意的是使用投影后的返回值,本人觉得使用List<Object[]>最方便
List<Object[]> list = criteria.list();
for (Object[] object : list) {
System.out.println(object);
}
}

说明:

1. 聚合函数上可以通过.as 或者 alias()设置别名,方便后续的排序操作。

demo8:投影

    /**
* 投影
* notice:只需要部分数据的使用,使用 Project.property("xxx")
* @param session
*/
private static void demo10(Session session) {
Criteria criteria=session.createCriteria(StuInfo.class,"stu");
 //关键代码,通过上述提到的 setProjection(Projections.projectionList().(add(选取的列).as("别名")).add((选取的列),"别名"))
criteria.setProjection(Projections.projectionList().add(Projections.property("stuId").as("id"))
.add(Projections.property("stuName"),"name")).addOrder(Order.desc("id")).addOrder(Order.asc("name"));
List<Object[]> item=criteria.list();
for (Object[] objects : item) {
System.out.println("stuName:"+objects[1]+" stuId:"+objects[0]);
}
}

说明:

1. 通过上述提到的 setProjection(Projections.projectionList().(add(选取的列).as("别名")).add((选取的列),"别名")) 进行相应操作。

demo9:分页

/**
* 分页
*
* @param session
* @param pageSize 每页容量
* @param pageNo 页码
*/
private static void demo12(Session session,int pageSize,int pageNo) {
Criteria criteria=session.createCriteria(StuInfo.class,"stu");
criteria.setMaxResults(pageSize);
int firstResult=(pageSize-1)*pageNo+1;
criteria.setFirstResult(firstResult);
List<StuInfo> stuInfos=criteria.list();
for (StuInfo stuInfo : stuInfos) {
System.out.println(stuInfo);
}
}

说明:

1. setMaxResults()为设置每页的容量。

2. setFirstResult()为设置起始值。

3. 不要忘记使用list()

4.API方法应该只能用户查询不能用户修改。

关于HQL部分可以参考此文:HQL查询

Hibernate查询之API查询的更多相关文章

  1. Hibernate框架之Criteria查询

    首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...

  2. Hibernate 中Criteria Query查询详解【转】

    当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询 ...

  3. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  4. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  5. [转载]Hibernate如何提升数据库查询的性能

    目录(?)[-] 数据库查询性能的提升也是涉及到开发中的各个阶段在开发中选用正确的查询方法无疑是最基础也最简单的 SQL语句的优化 使用正确的查询方法 使用正确的抓取策略 Hibernate的性能优化 ...

  6. 分享知识-快乐自己:Hibernate 中Criteria Query查询详解

    1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...

  7. [Hibernate Search] (3) 基础查询

    基础查询 眼下我们仅仅用到了基于keyword的查询,实际上Hibenrate Search DSL还提供了其他的查询方式,以下我们就来一探到底. 映射API和查询API 对于映射API.我们能够通过 ...

  8. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  9. hibernate 5原生sql查询测试学习代码

    基本查询 import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org. ...

随机推荐

  1. iptables进行端口重定向

    使用iptables进行端口重定向,方法如下: 在机器A上操作: #iptables -t nat -A PREROUTING -d 192.168.203.173 -p tcp -m tcp --d ...

  2. java问题诊断

    http://techblog.youdao.com/?p=961 http://linuxtools-rst.readthedocs.org/zh_CN/latest/advance/03_opti ...

  3. POJ 2368 巴什博奕

    题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜.求使后手必定获胜的L的最小值(L>=2). 题目思路: 巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少 ...

  4. UIImage图片拉伸方法

    纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...

  5. 门面模式(Facade)解析

    门面模式使用一个门面类来包装一些复杂的类,对外提供一个简单的访问方法. 见如下代码: class CPU { public void startup() { System.out.println(&q ...

  6. linux系统查询命令

    查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重复行 ...

  7. HttpURLConnection请求网络数据的GET请求

    //清单文件中添加权限 <uses-permission android:name="android.permission.INTERNET"/> new Thread ...

  8. Android开发 R cannot be resolved to a variable问题的分析

    R文件是系统自动生成的,如果没出现的话,你的XML文件是不是有错误?是否之前修改过res文件夹下面.xml文件 R文件没有生成的情况有几种: 1.项目没有自动编译:这种时候只需要简单的编译一下工程就会 ...

  9. jquery_api(事件一)

    一 .unload在火狐,谷歌无法弹出alerta是因为这两个浏览器默认组织alert弹出,unload事件可以进行一些对象销毁,事件解除绑定等清理工作. 如果你想在用户离开页面之前确认是否离开,最好 ...

  10. Oracle Sql优化之日期的处理

    1.时,分,秒,年,月,日等日期的常用取值方法 select hiredate, to_number(to_char(hiredate,'hh24')) 时, to_number(to_char(hi ...