Collection(集合)

列出所有有学生参加的项目:(项目的学生的数量大于0,则表示有学生参加)

public void testCollection() throws Exception {Session session = HibernateUtil.getInstance().getSession();//使用size属性或者SIZE函数来计算一个集合的元素数量放在where条件中是没有区别的// 都是一个子查询完成//String hql = "SELECT proj FROM Project proj WHERE proj.students.size > 0";String hql = "SELECT proj FROM Project proj WHERE SIZE(proj.students) > 0";Query query = session.createQuery(hql);List<Project> list = query.list();for (Project object : list) {System.out.println(object);}session.close();}

---------------------------------------------------------------------------------------------------------------------------------------------------

public void testCollection1() throws Exception {Session session = HibernateUtil.getInstance().getSession();// 判断集合是不是空// IS NOT EMPTY: 不是空,// IS EMPTY:是空,     String hql = "SELECT proj FROM Project proj WHERE proj.students IS NOT EMPTY";Query query = session.createQuery(hql);@SuppressWarnings("unchecked")List<Project> list = query.list();for (Project object : list) {System.out.println(object);}session.close();}

列出每个班级中学生的平均龄和最小年龄:(AVG(age),MIN(age))

①:先把学生按班级分组把学生的年龄查出来

select  AVG(stu.age),MIN(stu.age) from Student stu group by stu.clazz;

public void testFunction() throws Exception {Session session = HibernateUtil.getInstance().getSession();String hql = "SELECT stu.id, AVG(stu.age), MIN(stu.age) FROM Student stu GROUP BY stu.clazz";Query query = session.createQuery(hql);@SuppressWarnings("unchecked")List<Object[]> list = query.list();for (Object[] object : list) {System.out.println(Arrays.toString(object));}session.close();}
}

join(多表联合查询):

列出所有学生的名字对应的班级的名字:

select stu.name,clz.name From Student stu,Clazz clz Where stu.clz=clz  (当学生的班级等于班级的时候)

①:隐式连接

public void Jointest() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT stu.name,clz.name FROM Student stu,Clazz clz WHERE stu.clz=clz";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}}

②:显示连接 join

select stu.name,clz.name From Student stu  join  Clazz clz on stu.clz=clz  (当学生的班级等于班级的时候)     不能这么写

HQL语句按照上面那么写会报错:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: on near line 1, column 68 [select stu.name,clz.name From daomian.Student stu  join  Clazz clz on stu.clz=clz]

SELECT stu.name,clz.name FROM Student stu JOIN stu.clz clz

public void Jointest1() {Session session = BuildSesssionFactory.getSession();//通过Student 对象中Clazz 连接,Student中的外键找Clazz中的主键String sql = "SELECT stu.name,clz.name FROM Student stu JOIN stu.clz clz";Query createQuery = session.createQuery(sql);List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}
}

limit(分页):

select stu  from Student stu LIMIT 0,2;         不能这么写 HQL中不支持LIMIT关键字

HQL语句按照上面那么写会报错org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: LIMIT near line 1, column 38 [select stu  from daomian.Student stu LIMIT 0,2]

public void testLimit() throws Exception {Integer pageNo = 2;Integer pageSize = 10;// HQL中不支持LIMIT关键字Session session = HibernateUtil.getInstance().getSession();String hql = "SELECT stu FROM Student stu";Query query = session.createQuery(hql);// firstResult: 从数据库中的第几条数据开始查询query.setFirstResult((pageNo - 1) * pageSize);// maxResults: 表示本次分页的最大条数
        query.setMaxResults(pageSize);List<Student> list = query.list();for (Student object : list) {System.out.println(object);}session.close();}

Namedquery:

// NamedQuery:主要是为了一些经常使用,但是又不愿意每次都写时用
        // 在类的映射文件中添加一个标签,在class标签外添加一个query
        // 在属性name中来指定这个NamedQuery指定属性,
        // 在XML的innerTest中编写HQL语句

public void namedQuerytest() {Session session = BuildSesssionFactory.getSession();Query namedQuery = session.getNamedQuery("QUERY_ALL_STUDENT");@SuppressWarnings("unchecked")List<Student> list = namedQuery.list();for (Student student : list) {System.out.println(student);}// NamedQuery:主要是为了一些经常使用,但是又不愿意每次都写时用// 在类的映射文件中添加一个标签,在class标签外添加一个query// 在属性name中来指定这个NamedQuery指定属性,// 在XML的innerTest中编写HQL语句}

    <query name="QUERY_ALL_STUDENT">SELECT stu FROM Student stu</query>//在Student对象对应的xml中配置  这里的query标签中的name属性和java代码中session.getNamedQuery中的值是一样的

paramenter:(查询参数设置)

①:位置占位符

public class ParamenterTest {// 查询参数设置:// 1、位置占位符:就是使用`?`号来代表查询参数,// 通过setParameter(index,object)来根据?的位置来设置参数的;
    @Testpublic void positionTest() {Session session = BuildSesssionFactory.getSession();String sql = "select stu from Student stu Where stu.age between ? and ?";Query createQuery = session.createQuery(sql);createQuery.setParameter(0, 18);createQuery.setParameter(1, 20);@SuppressWarnings("unchecked")List<Student> list = createQuery.list();for (Student student : list) {System.out.println(student);}session.close();}

②:名称占位符

// 2、名称占位符:就是使用`:paramName`号来代表查询参数,// 通过setParamter(String name,object)这个方法为名称给占位符添加参数;
    @Testpublic void nameTest() {Session session = BuildSesssionFactory.getSession();String sql = "select stu from Student stu Where stu.age between :small and :big";Query createQuery = session.createQuery(sql);createQuery.setParameter("small", 18);createQuery.setParameter("big", 20);@SuppressWarnings("unchecked")List<Student> list = createQuery.list();for (Student student : list) {System.out.println(student);}session.close();}

用名称占位符的时候,要注意查询语句里边应该是(: 别名)

设置值的时候为    createQuery.setParameter("别名",值);

Result:(返回结果)

①:查询学生的总数:

Select COUNT(stu) FROM Student stu;

public class ResultTest {@Test@SuppressWarnings("unchecked")public void ResulTest() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT COUNT(stu.id) FROM Student stu";Query createQuery = session.createQuery(sql);List<Long> list = createQuery.list();for (Long long1 : list) {System.out.println(long1);}
}

--------------------------------------------------------------------------------------------------------------------------------------------------------

//当查询结果为单条记录的时候,不需要调用list()方法,只需要调用uniqueResult()方法即可
    @Testpublic void ResulTest1() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT COUNT(stu.id) FROM Student stu";Query createQuery = session.createQuery(sql);Long long1 = (Long) createQuery.uniqueResult();System.out.println(long1);}

②:返回一个Object[]:

Select  stu.id,stu.name,stu.age FROM Student stu;

    public void ResulTest2() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT stu.id,stu.name,stu.age FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Object[]> list = createQuery.list();for (Object[] objects : list) {System.out.println(Arrays.toString(objects));}}

③:返回一个list集合

Select  new LIST(stu.id,stu.name,stu.age) FROM Student stu;

    public void ResulTest3() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW LIST(stu.id,stu.name,stu.age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<List<Student>> list = createQuery.list();for (List<Student> list2 : list) {System.out.println(list2);}}

②:返回一个Map集合

Select  new MAP(stu.id,stu.name,stu.age) FROM Student stu;

    public void ResulTest4() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW MAP(stu.id ,stu.name,stu.age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Map<String,Student>> list = createQuery.list();for (Map<String, Student> map : list) {System.out.println(map);}}

⑤: new Map  给KEY值起一个别名

Select new MAP(stu.id AS ID,stu.name AS NAME,stu.age AS AGE) FROM Student stu;    AS不能省略

public void ResulTest5() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW MAP(stu.id as ID ,stu.name AS NAME,stu.age AS AGE) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<Map<String,Student>> list = createQuery.list();for (Map<String, Student> map : list) {System.out.println(map);}}

⑥: new 一个对象   Class  没有配置写全限定名称         VO对象  ValueObject

SELECT NEW StudentVO类的全限定名称(id,name,age) FROM Student stu

public class StudentVO {private Long id;private String name;private Integer age;
//此处省略getter/setter方法
}

public void ResulTest6() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW hibernate.query.result.StudentVO(id,name,age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<StudentVO> list = createQuery.list();for (StudentVO student : list) {System.out.println(student);}}

7:  new一个对象    在映射文件中配置Class(在FROM的那个对象的映射文件中配置)

SELECT NEW StudentVO(id,name,age) FROM Student stu

<import class="hibernate.query.result.StudentVO" rename="StudentVO"/>
//在class标签外   在hibernate-mapping标签内写

public class StudentVO {private Long id;private String name;private Integer age;
//此处省略getter/setter方法
}

    public void ResulTest7() {Session session = BuildSesssionFactory.getSession();String sql = "SELECT NEW StudentVO(id,name,age) FROM Student stu";Query createQuery = session.createQuery(sql);@SuppressWarnings("unchecked")List<StudentVO> list = createQuery.list();for (StudentVO student : list) {System.out.println(student);}}

转载于:https://www.cnblogs.com/zhang-bo/p/6628766.html

hibernate中查询方式(二):常用查询相关推荐

  1. mysql筛选字符个数为8的_听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)...

    一 . 常用查询介绍 1.创建表结构并插入内容 创建一个表 里面有id 毕业院校 家庭住址 name mysql> create table gou(id int primary key,sch ...

  2. Kibana 使用 KQL 查询语法-kibana 常用查询语法

    Kibana 查询语言 (KQL) 是一种使用自由文本搜索或基于字段的搜索过滤 Elasticsearch 数据的简单语法. KQL 仅用于过滤数据,并没有对数据进行排序或聚合的作用. KQL 能够在 ...

  3. MongoDB 查询语法与常用查询语句总结

    MongoDB 常用查询语句总结 先来一波查询语句语法的基本解释: 列子: db.mycol.find({"likes": {$gt:10}, $or: [{"by&qu ...

  4. Mysql中的七种常用查询连接详解

    目录 一.概述 二.连接查询的分类 三.七种常用连接查询详解 1.笛卡尔积: 2.内连接 2.1隐式与显式连接 ?2.2等值连接 ?2.3非等值连接 ?2.4自连接 3外连接 3.1左外连接: ?3. ...

  5. hibernate中各种不一样的查询hql,hqc(一)

    1,使用criteria查询 List list = getHibernateTemplate().executeFind(new HibernateCallback() {              ...

  6. Elasticsearch--进阶-进阶两种查询方式_request uri查询和query DSL查询---全文检索引擎ElasticSearch工作笔记009

    然后我们再来去查询高级一点的检索 1.可以看到在es中,支持两种方式的查询,一种是基于rest request uri,把请求的信息,放到http的地址上. 2.第二种方式就是使用REST reque ...

  7. php实现星座查询,php-十二星座查询系统(原创)

    function getstar($m,$d){ if($m==1){ if($d<21){ return "魔羯"; }else{ return "水瓶" ...

  8. Hibernate 学习笔记(二)—— Hibernate HQL查询和 QBC 查询

    目录 一.Hibernate 的 HQL 查询 1.1.查询所有数据 1.2.条件查询 1.3.排序查询 1.4.统计查询 1.5.分页查询 1.6.投影查询 二.Hibernate 的 QBC 查询 ...

  9. Hibernate查询方式

    Hibernate查询方式 1 OID查询 (1)根据id查询某一条记录,返回对象 2 对象导航查询 (1)根据id查询某个公司,再查询这个公司里面所有的员工   Company c=session. ...

最新文章

  1. python占多少空间_Python如何查看变量占用空间大小
  2. Invalid bound statement (not found)
  3. 从入门到深入Fiddler 2 (二)
  4. mpmath.psi python_【Python Package】mpmath学习笔记(2)
  5. Open vswitch 之Qos rate-limiting 原理
  6. 一套鼠标键盘操作两台电脑的方法
  7. python写连点脚本_python鼠标连点器-测试版
  8. iOS 9适配技巧(更新版)
  9. L1-7 机工士姆斯塔迪奥
  10. 本机电脑清除DNS缓存+浏览器清除DNS缓存
  11. 找错:maven常见错误
  12. 安卓自动滑屏脚本_自动滑屏软件下载-自动滑屏 安卓版v3.1.0-PC6安卓网
  13. vue 二级路由嵌套和二级路由高亮问题
  14. 中科大脑知识图谱平台建设及业务实践
  15. python 语音识别培训使用Python和Keras创建简单语音识别引擎
  16. python爬取网页返回响应中出现百度安全验证的解决办法
  17. scrapy 下载及处理文件和图片
  18. 10 个开源免费的电子商务平台
  19. UML建模工具Astah Pro教程
  20. 无线通信设计秘密四:唤醒下发算法

热门文章

  1. HTML5 响应式网页设计之页面美化(二.媒体查询)
  2. JavaScript内置对象导读(1)
  3. 枚举+贪心--经常用到的思路--过程不好弄是--枚举结果C. Elections
  4. C++中如何读取一个数的位数_初中数学:近似数和平均数知识点总结及练习
  5. SQL面试题(1-10)oracle写的
  6. bzoj 1055: [HAOI2008]玩具取名(区间DP)
  7. bzoj 1032: [JSOI2007]祖码Zuma(区间DP)
  8. [paper reading] CornerNet
  9. paper reading:Part-based Graph Convolutional Network for Action Recognition
  10. shell bash常用工具教程(curl,jq)