1.什么是hql?
HQL是Hibernate Query Language的缩写
2. hql和sql区别/异同
HQL SQL
类名/属性 表名/列名
区分大小写,关键字不区分大小写 不区分大小写
别名 别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言
3. 处理返回的结果集
3.1 单个对象
select没有逗号
3.2 Object[]
b.bookId, b.bookName
3.3 Map
new Map(b.bookId as bid, b.bookName as bname)
3.4 new 构造方法(attr1,attr2)
new Book(b.bookId, b.price)
以下是所有不同的返回结果 还有hql的命名参数 以及分页
/**
* hql语句处理结果1
* 返回对象 查询user
*/
@Test
public void text1() {
//String hql="from User where id=1";//查询单个
String hql="from User";//查询所有
Query createQuery = getsession.createQuery(hql);//拿到语句
List list = createQuery.list();
for (Object object : list) {
System.out.println(object.getClass().getName());//输出一个对象
System.out.println(object);//默认执行tostring
}
// Object obj = createQuery.getSingleResult();//得到sql查到的结果集
// System.out.println(obj);
}
/**
* hql语句处理结果2
* 返回查的某一个是字符串 hql查询的是类和类的属性 并不是表
* 如果想查一个 返回的对象 定义有参构造器 也要定义无参
*/
@Test
public void text2() {
//String hql="select username from User where id=1";
String hql="select new User(username,userpwd) from User where id=1";//查这个用户的类属性 其他的为空 返回的是对象
Query createQuery = getsession.createQuery(hql);//拿到语句
Object obj = createQuery.getSingleResult();//得到sql查到的结果集
System.out.println(obj.getClass().getName());//输出字符串
System.out.println(obj);
}
/**
* hql语句处理结果3
* 返回查的多个是数组 hql查询的是类和类的属性 并不是表
*/
@Test
public void text3() {
String hql="select username,userpwd from User where id=1";
Query createQuery = getsession.createQuery(hql);//拿到语句
Object obj = createQuery.getSingleResult();//得到sql查到的结果集
System.out.println(obj.getClass().getName());//输出数组地址
System.out.println(Arrays.toString((Object[])obj));//obj类型转换成obj数组
}
/**
* hql语句处理结果4
* 返回查的map集合 hql查询的是类和类的属性 并不是表
*/
@Test
public void text4() {
String hql="select new map(username as username,userpwd as userpwd) from User where id=1";
Query createQuery = getsession.createQuery(hql);//拿到语句
Object obj = createQuery.getSingleResult();//得到sql查到的结果集
System.out.println(obj.getClass().getName());//输出map集合java.util.HashMap
System.out.println(obj);//map集合 键值对
}
/**
* 定义参数
* 返回查的某一个是字符串 hql查询的是类和类的属性 并不是表
* 如果想查一个 返回的对象 定义有参构造器 不过也要定义无参
*/
@Test
public void text5() {
//String hql="select username from User where id=1";
//String hql="select new User(username,userpwd) from User where id=:id";//查id命名
String hql="select new User(username,userpwd) from User where id in:ids";//查多个命名
//相当于sql的prestatement
Query createQuery = getsession.createQuery(hql);//拿到语句
List<Integer> ids=new ArrayList<>();
ids.add(1);
ids.add(2);
createQuery.setParameterList("ids", ids);
List list2 = createQuery.list();
for (Object object : list2) {
System.out.println(object.getClass().getName());//输出一个对象
System.out.println(object);//默认执行tostring
}
// Object obj = createQuery.getSingleResult();//得到sql查到的结果集
// System.out.println(obj.getClass().getName());//输出字符串
// System.out.println(obj);
}
/**
* 连接查询
* hql查询的是类和类的属性 并不是表
*/
@Test
public void text6() {
String hql="select new map(o1.orderNo as a,o2.productId as b) from Order o1,Orderitem o2 where o1=o2.order";
Query createQuery = getsession.createQuery(hql);//拿到语句
List list2 = createQuery.list();
for (Object object : list2) {//查出所有
System.out.println(object.getClass().getName());
System.out.println(object);//默认执行tostring
}
}
/**
* 分页查询第二页 每页三条
*/
@Test
public void text7() {
//String hql="from User where id=1";//查询单个
String hql="from User";//查询所有
Query createQuery = getsession.createQuery(hql);//拿到语句
int page=2;
int offset=3;
createQuery.setFirstResult((page-1)*offset);//拿到当前页
createQuery.setMaxResults(offset);//拿到每页条数
List list = createQuery.list();//查询所有
for (Object object : list) {
System.out.println(object.getClass().getName());//输出一个对象
System.out.println(object);//默认执行tostring
}
// Object obj = createQuery.getSingleResult();//得到sql查到的结果集
// System.out.println(obj);
}