三套查询之HQL查询(原文再续书接上一回)

where子句部分(查询过滤部分)

Hibernate的where子句部分能支持的运算符,表达式、函数特别多,用法与sql语句是一样的.
常用的表达式、运算符、函数:
=、<、<=、>、>=、!=、and、or、distinct、between...and 、like、concat()、
is null, is not null, is empty, is not empty、second(...),
minute(...), hour(...), day(...), month(...)。
支持EJB-QL 3.0的函数:
trim(), lower(), upper(), length(), abs(), sqrt(), bit_length(), mod()
支持操作集合属性的函数:
size()|size, minelement(), maxelement(), minindex(), maxindex().

1.支持自定义的索引号

  1. //支持自定义的索引号
  2. @Test
  3. public void test5(){
  4. Query query = session.createQuery("select s from Student s where s.name like ?57");
  5. query.setParameter("57", "%ab%");
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

2.like

  1.    //like
  2. @Test
  3. public void test6(){
  4. Query query = session.createQuery("select s from Student s where s.name like ?3");
  5. query.setParameter("3", "%k%");
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

3.between and

  1. //between and
  2. @Test
  3. public void test7(){
  4. Query query = session.createQuery("select s from Student s where s.name like ?3 and s.java between ?4 and ?5");
  5. query.setParameter("3", "%k%").setParameter("4", 10).setParameter("5", 80);
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getJava()+student.getTeacher().getTname());
  9. }
  10. }

4.concat

  1. //concat
  2. @Test
  3. public void test8(){
  4. Query query = session.createQuery("select s from Student s where s.name like concat('%',?,'%')");
  5. query.setParameter(0, "ab");
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

5.is not null

  1. //is not null
  2. @Test
  3. public void test9(){
  4. Query query = session.createQuery("select s from Student s where s.name is not null");
  5. List<Student> list = query.list();
  6. for (Student student : list) {
  7. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  8. }
  9. }

6.trim

  1. //trim
  2. @Test
  3. public void test10(){
  4. Query query = session.createQuery("select s from Student s where trim(s.name) like ?");
  5. query.setParameter(0, "aa%");
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

7.upper

  1. //upper
  2. @Test
  3. public void test11(){
  4. Query query = session.createQuery("select upper(s.name) from Student s where s.name like ?");
  5. query.setParameter(0, "%b%");
  6. List<String> list = query.list();
  7. for (String string : list) {
  8. System.out.println(string);
  9. }
  10. }

8.length

  1. //length
  2. @Test
  3. public void test12(){
  4. Query query = session.createQuery("select s from Student s where length(s.name)>? ");
  5. query.setParameter(0, 4);
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

9.sqrt

  1. //sqrt
  2. @Test
  3. public void test13(){
  4. Query query = session.createQuery("select s from Student s where sqrt(s.id)=?");
  5. query.setParameter(0, 2.0);
  6. List<Student> list = query.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  9. }
  10. }

10.bit_length

  1. //bit_length 位长度
  2. @Test
  3. public void test14(){
  4. Query query = session.createQuery("select bit_length(s.name) from Student s where s.id=?57");
  5. query.setParameter("57", 3);
  6. Long uniqueResult = (Long) query.uniqueResult();
  7. System.out.println(uniqueResult);
  8. }

11.mod

  1. //mod
  2. @Test
  3. public void test15(){//选取id为偶数的学生
  4. Query query = session.createQuery("select s from Student s where mod(s.id,?)=?");
  5. query.setParameter(0, 2);
  6. query.setParameter(1, 0);
  7. List<Student> list = query.list();
  8. for (Student student : list) {
  9. System.out.println(student.getId()+student.getName());
  10. }
  11. }

12.size

操作集合属性的函数

  1. //size
  2. @Test
  3. public void test16(){
  4. Query query = session.createQuery("select t from Teacher t where size(t.students)>?");
  5. query.setParameter(0, 50);
  6. List<Teacher> list = query.list();
  7. for (Teacher teacher : list) {
  8. System.out.println(teacher.getTid()+teacher.getTname());
  9. }
  10. System.out.println("======================================");
  11. Query query1 = session.createQuery("select t from Teacher t where t.students.size>?");
  12. query1.setParameter(0, 30);
  13. List<Teacher> list1 = query1.list();
  14. for (Teacher teacher : list1) {
  15. System.out.println(teacher.getTid()+teacher.getTname());
  16. }
  17. }

13.minelement(), maxelement()

对集合中元素生成的列进行操作

  1. //minelement(), maxelement() 返回集合中的元素主键最大/最小的元素
  2. @Test
  3. public void test17(){
  4. Query query = session.createQuery("select maxelement(t.students) from Teacher t");
  5. List<Student> list = query.list();
  6. for (Student student : list) {
  7. System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
  8. }
  9. System.out.println("===============================");
  10. Query query1 = session.createQuery("select minelement(t.students) from Teacher t");
  11. List<Student> list1 = query1.list();
  12. for (Student student : list1) {
  13. System.out.println(student.getId()+":"+student.getName()+":"+student.getJava());
  14. }
  15. }

14.minindex(), maxindex()

对集合中的排序列进行操作。

对于索引了(有序)的集合,可以使用minindex 与 maxindex函数来引用到最小与最大的索引序数。

同理,可以使用minelement 与 maxelement函数来 引用到一个基本数据类型的集合中最小与最大的元素。(如上)

  1. List<Order> orders = session.createQuery("select o from Order o where minindex(o.orderItems) = ?").setParameter(0,0).list();
  2.  
  3. List<Order> orders = session.createQuery("select o from Order o where maxindex(o.orderItems) = ?").setParameter(0,0).list();

子查询

Hibernate的子查询与SQL语句中的子查询一样,子查询部分放在in、not in里面.

  1. //把老师的id和学生的id一样的学生查询出来
  2. @Test
  3. public void test19(){
  4. Query query = session.createQuery("select s from Student s where s.id in (select t.tid from Teacher t)");
  5. List<Student> list = query.list();
  6. for (Student student : list) {
  7. System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
  8. }
  9. }

多态查询

当持久化类存在继承关系时,查询父类时,它会把父类所有的对象查询出来,而且也会把所有子类对象查询出来。

  1. //查询所有
  2. @Test
  3. public void test20(){
  4. //Query query = session.createQuery("select o from java.lang.Object o");
  5. Query query = session.createQuery("from java.lang.Object");
  6. List list = query.list();
  7. System.out.println(list.size());
  8. }

命名查询

把所有hql语句写在一个单独的配置文件中.
一般在实际的项目中用得比较多,它会把比较复杂的hql语句写在一个单独的配置文件中,
方便以后对hql语句进行优化,也方便统一管理.

1.第一种方式*.hbm.xml

A.创建Query.hbm.xml

在官方下载的项目里搜索*.hbm.xml,拷贝一个文件到自己的项目里,修改文件名(任意),修改文件内容:

<!-- 定义HQL查询语句 -->

  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
  3. <hibernate-mapping>
  4. <query name="hql_student_xml">from Student</query>
  5. </hibernate-mapping>

B.配置到 hibernate.cfg.xml

C.代码使用

  1. @Test
  2. public void test21(){
  3. Query query = session.getNamedQuery("hql_student_xml");
  4. List<Student> list = query.list();
  5. for (Student student : list) {
  6. System.out.println(student.getId()+student.getName());
  7. }
  8. }

2.第二种方式在持久类上加注解

  1. package com.rong.entity.group;
  2.  
  3. import javax.persistence.Entity;
  4. import javax.persistence.FetchType;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. import javax.persistence.JoinColumn;
  9. import javax.persistence.ManyToOne;
  10. import javax.persistence.NamedQueries;
  11. import javax.persistence.NamedQuery;
  12.  
  13. @Entity
  14. //配置多个命名查询hql语句
  15. @NamedQueries(value={@NamedQuery(name="query1",query="select s from Student s where s.name like ?")
  16. ,@NamedQuery(name = "query2", query = "from Student")})
  17. //只能配置单个命名查询hql语句,一个类中该注解只能使用一次!
  18. @NamedQuery(name = "query3", query = "select count(s) from Student s")
  19. public class Student {
  20. @Id
  21. @GeneratedValue(strategy=GenerationType.AUTO)
  22. private int id;
  23. private String name;
  24. private int math;
  25. private int java;
  26. @ManyToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
  27. @JoinColumn(name="t_id",referencedColumnName="tid")
  28. private Teacher teacher;
  29. public int getId() {
  30. return id;
  31. }
  32. public void setId(int id) {
  33. this.id = id;
  34. }
  35. public String getName() {
  36. return name;
  37. }
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41. public int getMath() {
  42. return math;
  43. }
  44. public void setMath(int math) {
  45. this.math = math;
  46. }
  47. public int getJava() {
  48. return java;
  49. }
  50. public void setJava(int java) {
  51. this.java = java;
  52. }
  53. public Teacher getTeacher() {
  54. return teacher;
  55. }
  56. public void setTeacher(Teacher teacher) {
  57. this.teacher = teacher;
  58. }
  59. }
  1. @Test
  2. public void test22(){
  3. Query query1 = session.getNamedQuery("query1");
  4. query1.setParameter(0, "%ab%");
  5. List<Student> list1 = query1.list();
  6. for (Student student : list1) {
  7. System.out.println(student.getId()+student.getName());
  8. }
  9.  
  10. Query query2 = session.getNamedQuery("query2");
  11. List<Student> list2 = query2.list();
  12. for (Student student : list2) {
  13. System.out.println(student.getId()+student.getName());
  14. }
  15.  
  16. Query query3 = session.getNamedQuery("query3");
  17. Object uniqueResult = query3.uniqueResult();
  18. System.out.println(uniqueResult);
  19. }

  

Hibernate(七)的更多相关文章

  1. Hibernate(七)一对一映射

    一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...

  2. hibernate(七) hibernate中查询方式详解

    序言 之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西.就是因为缺少总结.在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数 ...

  3. Hibernate(七)__多对一 、一对多、 一对一、多对多

    1.many-to-one 以学生和部门之间的关系为例: Department.hbm.xml <?xml version="1.0" encoding="utf- ...

  4. 2、hibernate七步走完成增删改查

    一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...

  5. Java之旅hibernate(8)——基本关系映射

    何为关系,何为映射,关系这个词想必大家都不陌生.比方你和老师之间是师生关系,你和父母之间是父子或者父女(母子或者母女关系). 关系是存在某种联系物体之间产生的.什么都是可能的.比方你和工具,你仅仅能使 ...

  6. Hibernate映射解析——七种映射关系

    首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...

  7. SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系

            ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据 ...

  8. SSH:Hibernate框架(七种关联关系映射及配置详解)

    概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...

  9. Hibernate的七种映射关系之七种关联映射(二)

    继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.pri ...

  10. Hibernate的七种映射关系之基本映射

    说到关系,在这个世界无处不在,我们必须以某个关系的节点存在在这个世界网中.比如父子关系,师生关系,上下属关系甚至是危险关系.数据也是一样的,它的存在必为某其他节点做准备. Hibernate有七种映射 ...

随机推荐

  1. .Net 两个对像之间的映射 ( 二 )

    一.使用 class Program { static void Main(string[] args) { User u1 = new User(); u1.UserName = "aaa ...

  2. 20155206 实验一《Java开发环境的熟悉》实验报告

    实验内容 使用JDK编译.运行简单的Java程序 使用IDEA 编辑.编译.运行.调试Java程序. 实验代码 `import java.text.DecimalFormat; import java ...

  3. 2017-2018-1 20155308&20155321&20155330《信息安全技术》实验三——数字证书应用1

    2017-2018-1 20155308&20155321&20155330<信息安全技术>实验三--数字证书应用1 实验目的 了解PKI体系 了解用户进行证书申请和CA颁 ...

  4. 20155319《Java程序设计》实验三(敏捷开发与XP实践)实验报告

    20155319<Java程序设计>实验三(敏捷开发与XP实践)实验报告 一.实验内容及步骤 (一)使用Code菜单 在IDEA中使用工具(Code->Reformate Code) ...

  5. primary key和unique的区别

    定义了 UNIQUE 约束的字段中不能包含重复值,可以为一个或多个字段定义 UNIQUE 约束.因此,UNIQUE 即可以在字段级也可以在表级定义, 在 UNIQUED 约束的字段上可以包含空值.OR ...

  6. tkinter界面卡死的解决办法

    0.如果点击按钮,运行了一个比较耗时的操作,那么界面会卡死 import tkinter as tk import time def onclick(text, i): time.sleep(3) t ...

  7. 请求头(request headers)和响应头(response headers)解析

    *****************请求头(request headers)***************** POST /user/signin HTTP/1.1    --请求方式 文件名 http ...

  8. 【LG3231】[HNOI2013]消毒

    题面 洛谷 题解 代码 \(100pts\) #include<iostream> #include<cstdio> #include<cstdlib> #incl ...

  9. Drupal7重置密码方法

    Drupal版本 7.40 方法1: 根目录index.php添加 require_once 'includes/password.inc'; require_once 'includes/boots ...

  10. 创龙6748开发板加载.out出现a data verification error occurred, file load failed

    1. 需要提前添加GEL文件 2. 找到GEL文件路径 3. 然后再加载.out文件