Hibernate(七)

三套查询之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函数来 引用到一个基本数据类型的集合中最小与最大的元素。(如上)

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

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查询语句 -->

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
    <query name="hql_student_xml">from Student</query>
</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     }

  

原文地址:https://www.cnblogs.com/57rongjielong/p/8289719.html