hibernate-hql查询
select可以省略,但不建议这么做,尽量做到查询精确。
hql是面向对象的不管返回值还是条件都是对对象而言,不是数据库表。数据库中的一条记录就是一个对象。
1、根据条件查询某个具体对象
Student s = (Student) session.createQuery(“select s from Student s where s.id=2”).uniqueResult();
uniqueResult()—-返回唯一的结果集
2、查询符合条件的多个对象
List
list()—-返回对象的列表
3、查询所有的对象
List
4、查询对象中的某些个字段(2个以上)
List
for(Object[] s:lists){
System.out.println(s[0]);
}
查询结果是多个字段的对象,这些个对象被装在一个对象数组里,数组的每个元素是对象。lists中的元素是有两个以对象为元素的对象数组。
知道即可,可以直接查出对象,由对象获取属性即可。
4.1只查询一个字段时
List
以返回值的类型构成列表(返回值的类型是类中定义的类型)
比如
这个值返回就是一个数字,但是它的类型是Teacher,你就必须用Teacher的列表去接受
4.查询并且排序—order by
List
desc—-倒叙
asc(默认)—-升序
5、去除重复字段
List
6、带名占位符—-:id (:name)
List
.setParameter(“id”, 1)
.list();
上述要注意的一个,在hibernate5.2以后,特殊类型(比如setString())已经废弃,统一由setParameter()替代,
另外一个,这个方法的返回值都是query,可以实现链式编程。
6.1统一占位符
List
.setParameter(0, 1)
.list();
特别注意序号从0开始依次递增
新版的已经更新
7、fetch为LAZY的时候,即使存在关联关系也不会发出第二条sql语句
8、构建临时对象(这个对象又名DTO,VO)
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
11.1、在集合中in
List
11.3、 is null / is not null
List
11.4、 is empty
List
11.5、模糊查询like 重要 %表示0或多个字符,_表示一个字符
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
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”);
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();
还没有评论,来说两句吧...