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 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) ") ; 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();