select可以省略,但不建议这么做,尽量做到查询精确。

hql是面向对象的不管返回值还是条件都是对对象而言,不是数据库表。数据库中的一条记录就是一个对象。

1、根据条件查询某个具体对象

Student s = (Student) session.createQuery("select s from Student s where s.id=2").uniqueResult();

uniqueResult()---返回唯一的结果集

 

2、查询符合条件的多个对象

List<Student> students = session.createQuery("select s from Student s where s.teacher=2").list();

list()---返回对象的列表

 

3、查询所有的对象

List<Student> students = session.createQuery("select s from Student s ").list();

 

4、查询对象中的某些个字段(2个以上)

List<Object[]> lists = (List<Object[]>)session.createQuery("select s.name,s.id from Student s ").list();

for(Object[] s:lists){

System.out.println(s[0]);

}

查询结果是多个字段的对象,这些个对象被装在一个对象数组里,数组的每个元素是对象。lists中的元素是有两个以对象为元素的对象数组。

知道即可,可以直接查出对象,由对象获取属性即可。

 

4.1只查询一个字段时

List<String> lists = (List<String>)session.createQuery("select s.name from Student s ").list();

以返回值的类型构成列表(返回值的类型是类中定义的类型)

比如

hibernate-hql查询-LMLPHP

这个值返回就是一个数字,但是它的类型是Teacher,你就必须用Teacher的列表去接受

 

4.查询并且排序--order by

List<Student> students = session.createQuery("select s from Student s order by s.id desc").list();

desc---倒叙

asc(默认)---升序

 

5、去除重复字段

List<Teacher> lists = (List<Teacher>)session.createQuery("select distinct s.teacher from Student s ").list();

 

6、带名占位符---:id (:name)

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id=:id")

.setParameter("id", 1)

.list();

上述要注意的一个,在hibernate5.2以后,特殊类型(比如setString())已经废弃,统一由setParameter()替代,

另外一个,这个方法的返回值都是query,可以实现链式编程。

 

6.1统一占位符

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id=?")

.setParameter(0, 1)

.list();

特别注意序号从0开始依次递增

新版的已经更新

hibernate-hql查询-LMLPHP

7、fetch为LAZY的时候,即使存在关联关系也不会发出第二条sql语句

hibernate-hql查询-LMLPHP

8、构建临时对象(这个对象又名DTO,VO)

List<MsgInfo> lists = session.createQuery("select new com.bjsxt.hibernate.MsgInfo(m.id, m.cont, m.topic.title, m.topic.category.name) from Msg").list();

 

9、连接查询

List<Object[]) lists = List<Object[])session.createQuery("select t.title, c.name from Topic t join t.category c ").list();

 

10、多行函数 max,min,avg ,count,sum

Long i = (Long) session.createQuery("select count(*) from Student s").uniqueResult();

返回值是Long类型

 

11、单行函数 between and

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id between 0 and 5").list();

 

11.1、在集合中in

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id in(1,2)").list();

 

11.3、 is null / is not null

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id is not null").list();

 

11.4、 is empty

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.id is empty").list();

 

11.5、模糊查询like 重要 %表示0或多个字符,_表示一个字符

List<Student> lists = (List<Student>)session.createQuery("select s from Student s where s.name like '_h%' ").list();

字符由单引号括起。

 

11.6、不常见

Query q = session.createQuery("select lower(t.title)," + "upper(t.title)," + "trim(t.title)," + "concat(t.title, '***')," +

"length(t.title)" + " from Topic t ");

lower--小写 upper--大写 trim--空值 concat--字符合并 length--字符长度

 

11.7、数学公式

Query q = session.createQuery("select abs(t.id)," +"sqrt(t.id)," + "mod(t.id, 2)" + " from Topic t ");

 

11.8拿到日期,时间,时间戳

Query q = session.createQuery("select current_date, current_time, current_timestamp,s.id from Student s");

List<Object[]> lists = q.list();

for(Object o : q.list()) {

Object[] arr = (Object[])o;

System.out.println(arr[0] + " | " + arr[1] + " | " + arr[2] + " | " + arr[3]);

}

 

12、分组 group by

Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title") ;

 

13、where语句是对单条记录进行过滤,不能用于分组后的过滤

可以用having来筛选分组后的信息

Query q = session.createQuery("select t.title, count(*) from Topic t group by t.title having count(*) >= 1") ;

首先按标题分组,然后再过滤分组后的综合大一的组

最后返回的是,按标题分组,分组后总和大于1的那些个组

 

14、子查询

Query q = session.createQuery("from Topic t where t.id < (select avg(t.id) from Topic t)") ;

 

15、逻辑运算

Query q = session.createQuery("from Topic t where t.id < ALL (select t.id from Topic t where mod(t.id, 2)= 0) ") ;

<ALL 等价于小于最小的那个

 

16、exists

Query q = session.createQuery("from Topic t where not exists (select m.id from Msg m where m.topic.id=t.id)") ;

//用in 可以实现exists的功能

//但是exists执行效率高

 

17、执行更新语句

Query q = session.createQuery("update Topic t set t.title = upper(t.title)") ;

 

18、将查询语句放在实体类中

Query q = session.getNamedQuery("topic.selectCertainTopic");

hibernate-hql查询-LMLPHP

 

 

19、建立本地查询--当所有的ql语句不能满足时采用

SQLQuery q = session.createSQLQuery("select * from category limit 2,4").addEntity(Category.class);

 

20、QBC--Query by criterion

//criterion 标准/准则/约束

Criteria c = session.createCriteria(Topic.class) //from Topic

.add(Restrictions.gt("id", 2)) //greater than = id > 2

.add(Restrictions.lt("id", 8)) //little than = id < 8

.add(Restrictions.like("title", "t_"))

.createCriteria("category")

.add(Restrictions.between("id", 3, 5)) //category.id >= 3 and category.id <=5

;

//DetachedCriterea

for(Object o : c.list()) {

Topic t = (Topic)o;

System.out.println(t.getId() + "-" + t.getTitle());

}

 

21、QBE---query by example

Topic tExample = new Topic();

tExample.setTitle("T_");

Example e = Example.create(tExample)

.ignoreCase().enableLike();

Criteria c = session.createCriteria(Topic.class)

.add(Restrictions.gt("id", 2))

.add(Restrictions.lt("id", 8))

.add(e)

;

for(Object o : c.list()) {

Topic t = (Topic)o;

System.out.println(t.getId() + "-" + t.getTitle());

}

 

 

补充:

分页查询:

setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResukt表示这个对象在查询结果中的索引位置,索引位置的起始值为0,默认情况下,Query从查询结果中的第一个对象开始检索。

setMaxResult(int maxResults):设定一次最多检索出的对象的数目,在默认情况下,Query和Criteria接口检索出查询结果中所有对象。

EG://HQL查询

Query query=session.createQuery(“from User user order by user.id”);

query.setFirstResult(3);

query.setMaxResults(4);

query.list();

 

 

 

 

 

 

 

 

 

10-04 16:24