HQL数据查询基础_学习笔记

HQL定义:

  1. HQL(Hibernate Query Language)Hibernate查询语言
  2. HQL是面向对象的查询语言(查询的主体是映射的持久化类及其属性)
  3. HQL提供了丰富灵活的查询特性,Hibernate官方推荐的查询方式

HQL语句形式

select......from......where......group by......having......order by......


HQL注意问题

  1. HQL是面向对象的查询语言,对java类与属性大小写敏感
  2. HQL对关键字不区分大小写(习惯上小写)

Query接口简介
org.hibernate.Query接口
  1. Query接口定义有执行查询的方法(该方法完成了HQL语句的解析和执行过程,并返回查询结果)
  2. Query接口支持方法链编程(方法链编程:就是调用方法后 返回的方法结果 还是调用这个方法的对象。因此调用该对象的方法后还可以直接调用该对象的其他方法)风格,使得程序代码跟为简洁
Query实例的创建
Session的createQuery()方法创建一个Query实例
CreateQuery方法包含一个HQL语句参数,Create(hql);

Query执行查询
Query接口的list()方法执行HQL查询
list()方法返回结果数据类型为java.util.List,List集合中存放符合查询条件的持久化对象



from子句

  1. HQL语言最简形式
  2. from指定了HQL语言查询主体-持久化类及其属性
  3. 不需要引入持久化类的全限名,直接引入类名。因为在解析持久化类是hibernate会auto-import(自动引入)缺省情况
  4. 通过"as"或"  "为持久化类起别名,和SQL Server语法一样。在HQL语句的其他部分可以通过别名引用该类
代码示例:
//编写hql语句查询实例化类
String hql ="from Seller  s";
//创建Query实例对象
Query query = session.createQuery(hql);
//执行hql查询
List<Seller> sellers = query.list();
//在控制台中输出    在Seller类中已经重写了toString()方法
for(Seller seller:sellers){
System.out.println(seller);
}



选择---select子句

以Object[] 形式返回选择的属性 (如果没有指定返回的类型,默认Object[])  (如果select选择的属性只有一个,则返回的是Object对象而不是Object[])

代码示例:
String hql ="select s.name,s.tel from Seller  s";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(Object[] objs:list){
    System.out.println("name:"+objs[0]);
    System.out.println("tel:"+objs[1]);
}



以List形式返回选择的属性(select子句中使用new list指定)

代码示例:
String hql ="select new list ( s.name,s.tel ) from Seller  s";
Query query = session.createQuery(hql);
List<List> lists = query.list();
for(List list:lists){
    System.out.println("name:"+list.get(0));
    System.out.println("tel:"+list.get(1));
}


以map形式返回选择属性(select子句中使用 new map指定。key值为索引值,字符串类型)
代码示例:
String hql ="select new map ( s.name n,s.tel) from Seller  s";
Query query = session.createQuery(hql);
List<Map> maps = query.list();
for(Map map: maps){
    //通过别名获取
    System.out.println("name:"+map.get("n"));
    //通过序号获取
    System.out.println("tel:"+map.get("1"));
}


以自定义类型返回选择的属性(持久化类中有对应的构造器,select子句中调用定义的构造器)
代码示例:
String hql ="select new Seller( s.name,s.tel ) from Seller  s";
Query query = session.createQuery(hql);
List<Seller> sellers = query.list();
for(Seller seller : sellers){
    System.out.println("name:"+seller.getName());
    System.out.println("tel:"+seller.getTel());
}


去掉重复的结果------distinct关键字
代码示例:
String hql ="select distinct c.sex  from customer c";
Query query = session.createQuery(hql);
List<Object> lists = query.list();
for(Object obj :lists){
    System.out.println(obj);
}




限制--where子句(通过逻辑表达式设置查询条件,限制返回的查询结果

比较运算(持久化类的属性  和   给定的查询条件之间的比较)
比较运算符: = , < > , < , > , > = , < =
null值判断--------is [not] null (is null和=效果一样,is not null 和< >效果一样)


范围运算
[not] in(列表 / 子查询)-------返回true/false
[not] between 值1 and 值2


字符串模式匹配
like关键字,通配符 % :(任意个字符),  _ : (一个字符)


逻辑运算
and(逻辑与)
or(逻辑或)
not(逻辑非)


集合运算
is [not] enpty 集合[不]为空,不包含任何元素
members of 员孙属于集合


在HQL中使用  +  -  *  /  运算符
四则运算符可以在where子句和select子句中使用
//代码示例
String hql = " from Commodity c where c.price*5>3000 ";
        Query query = session.createQuery(hql);
        List<Commodity> commodities = query.list();
        
        for(Commodity c : commodities){
            System.out.println("name:"+c.getName());
            System.out.println("price:"+c.getPrice()*5);
        }


查询单个对象(uniqueResult方法)
wherer子句的条件设置,似的查询结果最多只有一个。
示例代码:
String hql = " from Customer c where c.age>20 ";
        Query query = session.createQuery(hql);
        
        Customer c = (Customer)query.uniqueResult();
        
        System.out.println(c.getName());






排序--order by子句
升序排序asc
降序排序desc
示例代码:
String hql = " from Commodity order by seller.id asc,price desc,name asc  ";
        Query query = session.createQuery(hql);
        List<Commodity> commodities = query.list();
        
        for(Commodity c : commodities){
            System.out.println("name:"+c.getName());
            System.out.println("price:"+c.getPrice());
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值