Hibernate之HQL基本用法

关于HQL

HQL与SQL非常类似,只不过SQL的操作对象是数据表,列等对象,而HQL操作的是持久化类,实例,属性等。

HQL是完全面向对象的查询语言,因此也具有面向对象的继承,多态等特性。

使用HQL的一般步骤为:

获取session对象

编写HQL语句

使用session的createQuery方法创建查询对象(Query对象)

使用SetXxx(index/para_name, value)为参数复制

使用Query对象的list()方法返回查询结果列表(持久化实体集)

下面演示一下HQL的基本用法,演示之前先附上之前的一个例子,双向N-N关联映射,

假设有下面两个持久化类Person和Event之间成N-N双向关联,代码如下,

Person类

 1 package hql;
 2
 3 import java.util.*;
 4
 5 import javax.persistence.*;
 6
 7
 8 @Entity
 9 @Table(name = "person_inf")
10 public class Person
11 {
12     @Id @Column(name = "person_id")
13     @GeneratedValue(strategy=GenerationType.IDENTITY)
14     private Integer id;
15     private String name;
16     private int age;
17     @ManyToMany(cascade=CascadeType.ALL, targetEntity=MyEvent.class)
18     @JoinTable(name = "person_event" ,
19         joinColumns = @JoinColumn(name = "person_id"
20             , referencedColumnName="person_id"),
21         inverseJoinColumns = @JoinColumn(name = "event_id"
22             , referencedColumnName="event_id")
23     )
24     private Set<MyEvent> myEvents
25         = new HashSet<>();
26     @ElementCollection(targetClass=String.class)
27     @CollectionTable(name="person_email_inf",
28         [email protected](name="person_id" , nullable=false))
29     @Column(name="email_detail" , nullable=false)
30     private Set<String> emails
31         = new HashSet<>();
32
33     public void setId(Integer id)
34     {
35         this.id = id;
36     }
37     public Integer getId()
38     {
39         return this.id;
40     }
41
42     public void setName(String name)
43     {
44         this.name = name;
45     }
46     public String getName()
47     {
48         return this.name;
49     }
50
51     public void setAge(int age)
52     {
53         this.age = age;
54     }
55     public int getAge()
56     {
57         return this.age;
58     }
59
60     public void setMyEvents(Set<MyEvent> myEvents)
61     {
62         this.myEvents = myEvents;
63     }
64     public Set<MyEvent> getMyEvents()
65     {
66         return this.myEvents;
67     }
68
69     public void setEmails(Set<String> emails)
70     {
71         this.emails = emails;
72     }
73     public Set<String> getEmails()
74     {
75         return this.emails;
76     }
77     public Person() {}
78     public Person(String name, int age) {
79         this.name = name;
80         this.age = age;
81     }
82
83 }

Event类

 1 package hql;
 2
 3 import java.util.*;
 4
 5 import javax.persistence.*;
 6
 7 @Entity
 8 @Table(name="event_inf")
 9 public class MyEvent
10 {
11     @Id @Column(name="event_id")
12     @GeneratedValue(strategy=GenerationType.IDENTITY)
13     private Integer id;
14     private String title;
15     private Date happenDate;
16     @ManyToMany(targetEntity=Person.class , mappedBy="myEvents")
17     private Set<Person> actors
18         = new HashSet<>();
19
20     public void setId(Integer id)
21     {
22         this.id = id;
23     }
24     public Integer getId()
25     {
26         return this.id;
27     }
28
29     public void setTitle(String title)
30     {
31         this.title = title;
32     }
33     public String getTitle()
34     {
35         return this.title;
36     }
37
38     public void setHappenDate(Date happenDate)
39     {
40         this.happenDate = happenDate;
41     }
42     public Date getHappenDate()
43     {
44         return this.happenDate;
45     }
46
47     public void setActors(Set<Person> actors)
48     {
49         this.actors = actors;
50     }
51     public Set<Person> getActors()
52     {
53         return this.actors;
54     }
55     public MyEvent() {}
56     public MyEvent(String title, Date happenDate) {
57         this.title = title;
58         this.happenDate = happenDate;
59     }
60 }

PersonManager类

 1 package hql;
 2
 3 import org.hibernate.SessionFactory;
 4 import org.hibernate.Transaction;
 5 import org.hibernate.Session;
 6 import org.hibernate.cfg.Configuration;
 7
 8 import java.text.ParseException;
 9 import java.text.SimpleDateFormat;
10 import java.util.Date;
11 import java.util.Set;
12 import java.util.HashSet;
13
14 public class PersonManager
15 {
16
17     public static void testPerson() throws ParseException
18     {
19         Configuration conf = new Configuration().configure();
20         conf.addAnnotatedClass(Person.class);
21         conf.addAnnotatedClass(MyEvent.class);
22         SessionFactory sf = conf.buildSessionFactory();
23         Session sess = sf.openSession();
24         Transaction tx = sess.beginTransaction();
25         Person p1 = new Person("张三",20);
26         p1.getEmails().add("[email protected]");
27         p1.getEmails().add("[email protected]");
28
29
30         Person p2 = new Person("李四",30);
31         p2.getEmails().add("[email protected]");
32
33
34         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
35         MyEvent e1 = new MyEvent("大学毕业", sdf.parse("2012-06-01"));
36         MyEvent e2 = new MyEvent("参加工作", sdf.parse("2012-10-01"));
37         MyEvent e3 = new MyEvent("出国旅游", sdf.parse("2013-05-01"));
38         MyEvent e4 = new MyEvent("回家过年", sdf.parse("2013-12-20"));
39         MyEvent e5 = new MyEvent("升职加薪", sdf.parse("2014-01-01"));
40
41         p1.getMyEvents().add(e1);
42         p1.getMyEvents().add(e3);
43         p1.getMyEvents().add(e4);
44         p1.getMyEvents().add(e5);
45
46         p2.getMyEvents().add(e2);
47         p2.getMyEvents().add(e3);
48         p2.getMyEvents().add(e4);
49
50         sess.save(p1);
51         sess.save(p2);
52
53         tx.commit();
54         sess.close();
55     }
56
57     public static void main(String[] args) throws ParseException {
58         testPerson();
59     }
60 }

执行上面的

时间: 2024-10-10 00:48:37

Hibernate之HQL基本用法的相关文章

Hibernate六 HQL查询

HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条件查询,甚至使用原生的SQL查询语句.Hibernate还提供了一种数据过滤功能,这些都用于删选目标数据.2.查询步骤:(1)获取Hibernate Session对象(2)编写HQL语句(3)以HQL语句为参数,调用Session的createQuery()方法创建查询对象(4)如果HQL语句包含

Hibernate之HQL介绍

Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL查询语言 QBC检索方式:使用QBC(Query By Criteria)API来检索对象.这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 本地SQL检索方式:使用本地数据库的SQL查询语句 本文主要介绍第三种方式,也就是HQL检索对象. HQL(Hibernate Quer

【HQL】hibernate查询语言hql

hibernate查询语言hql 在hql中关键字不区分大小写,通常小写,类的名称和属性名称必须区分大小写 1.简单属性查询[重要] * 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致 * 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数 对象数组中元素的类型取决于属性在实体类中的类型 * 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象 参见:SimplePropertyQueryTest.java 2.实体对象查询[重要] *

Hibernate学习---第九节:Hibernate之hql

一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; import java.util.Set; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的) * 属性通

Java_Web三大框架之Hibernate+jsp+HQL分页查询

分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { private int id;//房屋id private HouseType type;//房屋类型 private Users2 user;//用户 private Street street;//街道 private String title;//标题 private String descr

hibernate的hql查询语句

hibernate的hql查询语句 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码: Special类: public class Special { private int id; private String name; private String type; private Set<Classroom> rooms; .

hibernate中Restrictions的用法

方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge >= Restrictions.lt < Restrictions.le <= Restrictions.between BETWEEN Restrictions.like LIKE Restrictions.in in Restrictions.and and Restrictions.or or

hibernate中inverse的用法

hibernate中inverse的用法 转自:http://blog.csdn.net/leader_lx/archive/2008/08/06/2774137.aspx 一.Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系,说白了就是hibernate如何生成Sql来维护关联的记录 Hibernate仅仅按照主控方对象的状态的变化来同

Hibernate中HQL函数汇总及其说明

Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.以下就是HQL的一些常用函数,有了这些函数,我们就可以拥有更多的灵活性,比如HQL如何取余,HQL如何返回集合的最值,HQL字符串处理,