HQL数据查询学习

最近太懒,没怎么学习,更新一点最近学习内容.

第1章.课程介绍

课程内容

  1. 了解HQL
  2. 准备查询
  3. 查询子句

 

查询子句

检索对象—from子句

选择—select子句

限制—where子句

排序—order by子句

 

学习目标

  1. 了解HQL定义以及HQL语句形式
  2. 掌握Query对象的使用
  3. 能够编写出符合数据查询要求的HQL语句

 

第2章.了解HQL

本章内容

1.HQL定义

2.HQL语句形式

3.初学HQL需要注意的问题

 

一 HQL定义

1.Hibernate Query Language,Hibernate查询语言

2.HQL是面向对象的查询语句

HQL:映射配置的持久化类及其属性

SQL:数据库表

3.HQL提供了丰富灵活的查询特性,hibernate官方推荐查询方式

 

二 HQL语句形式

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

三 初学HQL需要注意的问题

  1. HQL是面向对象的查询语言,对Java类与属性大小敏感

HQL与SQL形式相似,本质不同

  1. HQL对关键字不区分大小写

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

 

第3章.准备查询

本章内容

1.org.hibernate.Query接口

2. Query实例的创建

3.执行查询

一 Query接口简介

org.hibernate.Query接口

1.Query接口定义有执行查询的方法

2.Query接口支持方法链编程风格,使得程序代码更为简洁

二 Query实例创建

1.Session的createQuery()方法创建Query实例

2.createQuery方法包含一个HQL语句参数, cerateQuery(hql)

Query执行查询

1.Query接口的list()方法执行HQL查询

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

三 Query接口应用编程示例——数据库分析

 

字段名

字段描述

数据类型

ID

主键

int

name

商家名称

varchar

tel

电话

varchar

address

地址

varchar

wesite

商家网站

varchar

star

商家星级

varchar

business

经营范围

varchar

商家表(Seller)

字段名

字段描述

数据类型

ID

主键

int

name

姓名

varchar

tel

电话

varchar

address

地址

varchar

email

电子邮箱

varchar

sex

性别

varchar

description

简介

varchar

age

年龄

int

birthday

生日

date

客户表(Customer)

字段名

字段描述

数据类型

ID

主键

int

name

商品名称

varchar

price

价格

double

util

计量单位

varchar

category

商品分类

varchar

description

商品简介

varchar

seller

所属商家

int

商品表(Commodity)

字段名

字段描述

数据类型

ID

主键

int

customer

所属客户

int

tradedate

交易日

date

status

订单状态

varchar

amount

订单金额

double

订单表(OrderForm)

字段名

字段描述

数据类型

ID

主键

int

orderid

所属订单

int

commodity

订单商品

int

discount

订单折扣

double

actprice

成交价格

double

amount

订单数量

double

订单明细表(OrderItem)

四 Query接口应用编程示例——代码实现

项目结构:

持久化类代码:略。

session工厂类代码:略

查询关键代码:

@Test
	public void testFromClause(){
		String hql = " from Seller  s ";
		
		Query query = session.createQuery(hql);
		
		List<Seller> sellers = query.list();
		for(Seller seller : sellers){
			System.out.println("name:"+seller.getName());
		}
	}

	@Before
	public void setUp() throws Exception {
		session = HibernateSessionFactory.getCurrentSession();
	}

	@After
	public void tearDown() throws Exception {
		session.close();
	}

第4章.查询对象—from子句

1.from子句

2.from子句中持久化类的引用

3.别名的使用

 

一 from子句

  1. HQL语句最简形式
  2. from指定了HQL语句查询主体——持久化类及其属性

二 from子句中持久化类的引用

  1. 不需要引入持久化类的全限定名,直接引入类名
  2. auto-import(自动引入)缺省情况

三 别名的使用

  1. 为被查询类指定别名
  2. 在HQL 语句其他部分通过别名引用该类
  3. 别名命名习惯

如:from Seller

别名: seller

单字母:s

第5选择select子句

本章内容

1.以object[]形式返回选择的属性

2.以List形式返回选择的属性

3.以map形式返回选择的属性

4.以自定义类型返回选择的属性

5.获取独特的结果——distinct关键字

一 以object[]形式返回选择的属性

当返回结果为多个属性时

public void testSelectClauseObjectArray(){
		String hql = " select s.name,s.tel,s.address,s.star from Seller s ";
		
		Query query = session.createQuery(hql);
		
		List<Object[]> list = query.list();
		
		for(Object obj[] : list){
			System.out.println("name:"+obj[0]);
			System.out.println("tel:"+obj[1]);
			System.out.println("address:"+obj[2]);
			System.out.println("star:"+obj[3]);

		}
	}

当返回结果为一个属性时

	@Test
	public void testSelectClauseObjectArray(){
		String hql = " select c.name from Customer c ";
		Query query = session.createQuery(hql);
		List<Object> list = query.list();
		for(Object objs : list){
			System.out.println("name:"+objs);
		}
	}

二 以List形式返回选择的属性

  1. select子句中使用new list指定

如:select new list(s.name,s.tel,s.address)from Seller s;

@Test
	public void testSelectClauseList(){
		String hql = " select new list(s.name,s.tel,s.address) 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));
			System.out.println("address:"+list.get(2));
		}
	}

三 以map形式返回

  1. select子句中使用new map 指定
  2. key值为索引值,字符串类型,默认为序号,还可以用别名获取

如:select new map(s.name,s.tel,s.address)from Seller s;

select new map(s.name as name,s.tel as tel,s.address as address)from Seller s;

   

select new map(s.name as name,s.tel as tel,s.address as address)from Seller s;
	@Test
	public void testSelectClauseMap(){
		String hql = " select new map(s.name,s.tel,s.address) from Seller s ";
		Query query =session.createQuery(hql);
		
		List<Map> maps = query.list();
		for(Map map : maps){
			System.out.println("name:"+map.get("0"));
			System.out.println("tel:"+map.get("1"));
			System.out.println("address:"+map.get("2"));
		}
	}

四 以自定义类型返回选择的属性

如:select new seller(s.name,s.tel,s.address)from Seller s;

   

@Test
	public void testSelectClauseSelf(){
		String hql = " select new Seller(s.name,s.tel,s.address) 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());
			System.out.println("address:"+seller.getAddress());
		}
	}

五distinct关键字

  1. 使用distinct关键字去除查询结果中的重复元素

如:select distinct sex c.sex from Customer c;

   

@Test
	public void testDistinct(){
		String hql = "select distinct c.sex from Customer c ";
		Query query = session.createQuery(hql);
		List<Object> list = query.list();
		
		for(Object obj : list){
			System.out.println(obj);
		}
	}

第6限制——where子句

本章内容

1.比较运算

2.范围运算

3.字符串模式匹配

4.逻辑运算

5.集合运算

6.在HQL中使用+-×/运算符

7.查询单个对象(uniqueResult方法)

一 比较运算

1.=,<>,<,>,>=,<=

2.null值判断—is [not] null

  

	@Test
	public void testWhere1(){
		String hql = " from Commodity c where c.price<=200 ";
		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());
		}
	}

二 null值判断运算

三 范围运算

1.[not] in (列表)

2.[not] between 值1 and 值2

  

	@Test
	public void testWhere2(){
		String hql = " from Customer c where c.age not between 20 and 40 ";
		Query query = session.createQuery(hql);
		List<Customer> customers = query.list();
		
		for(Customer c: customers){
			System.out.println("name:"+c.getName());
			System.out.println("age:"+c.getAge());
		}
	}

四 字符串模式匹配

  1. like关键字
  2. 通配符%,_

%:任意个字符

_:一个字符

   

	@Test
	public void testWhere3(){
		String hql = " from Customer c where c.address like '%北京%'";
		Query query = session.createQuery(hql);
		List<Customer> customers = query.list();
		
		for(Customer c : customers){
			System.out.println("name:"+c.getName());
			System.out.println("address :"+ c.getAddress());
		}
	}

五 逻辑运算

  1. and(逻辑与),or(逻辑或)
  2. not(逻辑非)

   

	@Test
	public void testWhere2(){
		String hql  = " from Commodity c where c.price between 1000 and 5000 and c.category like '%电脑%' or name like '%电子%' ";
		Query query = session.createQuery(hql);
		List<Commodity> commodities = query.list();
		
		for(Commodity c : commodities){
			System.out.println("name:"+c.getName());
			System.out.println("category:"+c.getCategory());
			System.out.println("price:"+c.getPrice());
		}
	}

六 集合运算

  1. is [not] empty 集合[不]为空,不包含任何元素
  2. member of 元素属于集合

   

@Test
	public void testWhere1(){
		String hql = " from Order o where o.orderItems is not empty ";
		Query query = session.createQuery(hql);
		List<Order> orders = query.list();
		
		for(Order order : orders){
			System.out.println(order.getCustomer().getName());
			System.out.println(order.getAmount());
			System.out.println(order.getTradeDate());
		}
	}

七 在HQL中使用+-×/运算符

  1. HQL语句中也可以使用+-×/四则运算
  2. 四则运算可以在where子句和select子句使用

   

	@Test
	public void testWhere4(){
		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方法)

1.Query接口的uniqueResult方法

2.where子句条件的设置

	@Test
	public void testWhere4(){
		String hql = " from Customer c where c.age>20 ";
		Query query = session.createQuery(hql);
		
		Customer c = (Customer)query.uniqueResult();
		
		System.out.println(c.getName());
	}

第7章 排序—order by子句

本章内容

1.使用order by子句对查询结果排序

1)升序排序asc

2)降序排序desc

  

	@Test
	public void testOrderby(){
		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());
		}
	}

课程总结

1.HQL语句形式

2.HQL语句大小写敏感,特别是持久化类及其属性的大小写

3.别名的使用

4.select子句使用自定义类返回选择属性,持久化类构造器处理

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值