-
什么是hql
HQL是Hibernate Query Language的缩写查全部
-
hql和sql区别/异同
HQL SQL
类名/属性 表名/列名
区分大小写,关键字不区分大小写 不区分大小写
别名 别名
?,从下标0开始计算位置(hibernate5之后不支持) ?,从顺序1开始计算位置
:命名参数 不支持:命名参数
面向对象的查询语言 面向结构查询语言注1:QuerySyntaxException:book is not mapped
-
处理返回的结果集
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中使用占位符
4.1 ?占位符
从下标0开始计算位置
hibernate5之后不再支持?占位符
4.2 :命名参数
-
连接查询
-
聚合函数
sum
avg
max
min
count -
hql分页
int page = 2;// 页码:page
int row = 10;// 每页行数:rows
query.setFirstResult((page - 1) * row);// 设置起始记录下标
query.setMaxResults(row);// 设置返回的最大结果集
资料
(hibernate hql函数)
方法 说明 类型 支持 测试结果HQL 使用方法
abs(n) 取绝对值 数学函数 jpa ql hql √ abs(column_name[数字类型对象属性])
sqrt(n) 取平方根 数学函数 jpa ql hql √ sqrt(column_name[数字类型对象属性])
mod(x,y) 取余数 数学函数 jpa ql hql √ mod([对象属性(数字)或值],[对象属性(数字)或值]) 数字必须是整型。返回参数1/参数2得的余数。
size(c) 方法集合内对象数量 集合函数 jpa ql hql
minelement(c) 返回集合中最小元素 集合函数 hql
maxelement(c) 返回集合中最大元素 集合函数 hql
minindex(c) 返回索引集合最小索引 集合函数 hql
maxindex(c) 返回索引集合最大索引 集合函数 hql
concat(s1,s2) 连接连个字符串 字符串函数 jpa ql hql √ concat([对象属性],[对象属性]) 相当与“||”
substring(s,offset,length) 返回部分字符串 字符串函数 jpa ql hql √ substring([要截取的字符串属性字段],开始位置,截取长度)
trim([[ both | leading 去掉字符串中的某个给定的字符.
| trailing]] char from s) 默认去掉字符串两面的空格. 字符串函数 jpa ql hql √ 默认用法,trim([字符串对象属性列]) 将字段两端的空格去掉。
lower(s) 小写 字符串函数 jpa ql hql √ lower([字符串对象属性列]) 将该列结果含有的字母全部大写
upper(s) 大写 字符串函数 jpa ql hql √ upper([字符串对象属性列]) 将该列结果含有的字母全部大写
length(s) 返回字符串长度 字符串函数 jpa ql hql √ length(字段名) 返回字段内容的长度,包括数字。null值返回null.
current_date() 返回数据库当前日期 时间函数 jpa ql hql √ current_date() 返回数据库当前日期
current_time() 时间 时间函数 √ current_time() 返回数据库当前时间
current_timestamp() 时间戳
second(d) 从日期中提取具体参数分别为: 时间函数 hql √ second(时间字段) 空的时候返回null
minute(d) 秒,分,小时,天,月,年 √ 同上
hour(d) √ 同上
day(d) √ 同上
month(d) √ 同上
year(d) √ 同上
cast(t as type) 强制类型转换 转换函数 hql √ cast([字段或值] as [要转换的类型-int,string...])
max()
min()
count()
**
(hql随机函数)
**
select * from EngageExam e where e.majorKindId=? and e.majorId=? order by newid()
**
(select子句使用小技巧)
**
select 子句选择将哪些对象与属性返 回到查询结果集中. 考虑如下情况:
select mate
from Cat as cat
inner join cat.mate as mate
该语句将选择mates of other Cats。(其他猫的配偶) 实际上, 你可以更简洁的用以下的查询语句表达相同的含义:
select cat.mate from Cat cat
查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:
select cat.name from DomesticCat cat
where cat.name like ‘fri%’
select cust.name.firstName from Customer as cust
查询语句可以返回多个对象和(或)属性,存放在 Object[]队列中,
select mother, offspr, mate.name
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
或存放在一个List对象中,
select new list(mother, offspr, mate.name)
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
也可能直接返回一个实际的类型安全的Java对象,
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
假设类Family有一个合适的构造函数.
你可以使用关键字as给“被选择了的表达式”指派别名:
select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat
这种做法在与子句select new map一起使用时最有用:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat
该查询返回了一个Map的对象,内容是别名与被选择的值组成的名-值映射。
**
(sql和hql)
**
SQL
- 结构化查询语言,表与列
- 不区分大小写
- 可以通过空格与as给表和列起别名
- 支持?占位符,从顺序1开始
HQL
- 面向对象的查询语言,类与属性
- 类和属性区分大小写,但关键字不区别大小写
- 可以通过空格与as给类和属性起别名
- 支持?占位符,从下标0开始
- 支持:命名参数
HQL常见错误
Query接口常用方法
单个参数
setXXX(int,XXX);
setXXX(String,XXX);
setParameter(int,Object);
setParameter(String,Object);
一组参数
setParameterList(String,Object[]);//窗口中最少要保存一个值
setParameterList(String,Collection);
**
(原生sql)
**
原生sql:
SQLQuery sqlQ = session.createSQLQuery("select tname,tage from teacher ");
//指定查询出来的列的名称和类别
sqlQ.addScalar("tname", Hibernate.STRING);
sqlQ.addScalar("tage", Hibernate.INTEGER);
//有条件的
SQLQuery sqlQ = session.createSQLQuery("select * from teacher where tname like :tname and tage > :tage");
Teacher t = new Teacher();
t.setTage(26L);
t.setTname("%王%");
sqlQ.addEntity("t",Teacher.class);
sqlQ.setProperties(t);
//统计 分组
SQLQuery sqlQ=session.createSQLQuery("select s.sclass,count(*) c from students s group by s.sclass order by c desc");
sqlQ.addScalar("sclass", Hibernate.STRING);
sqlQ.addScalar("c", Hibernate.INTEGER);
//连接查询 (没有fetch,只有在hql中才有)
// SQLQuery sqlQ=session.createSQLQuery(“select s.,t. from students s left join tAndS ts on s.sid=ts.studentId left join teachers t on ts.teacherId=t.tid where t.tname like ?”);
// sqlQ.addEntity(“s”,Student.class);
// sqlQ.addEntity(“t”,Teacher.class);
// sqlQ.setString(0, “%李四%”);
分页
//原生sql方式 其他方式也差不多
int pageRow=2;//每页显示多少行
int currPage=2;//当前页
SQLQuery sqlQ=session.createSQLQuery("select t.* from teachers t");
sqlQ.addEntity("t",Teacher.class);
sqlQ.setFirstResult((currPage-1)*pageRow);
sqlQ.setMaxResults(pageRow);
List<Teacher> ts=sqlQ.list();
for(Teacher t : ts){
System.out.println(t.getTname()); }
Hibernate SQLQuery 查询char类型结果为一个字符解决方法
在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,现有以下几种解决方法:
1:将你要查询的实体转换成实体Bean,使用HQL查询,这样就不存在字段映射的问题了,但是这样比较麻烦;
2:可以使用Hibernate中的addScalar(String arg,Type type)来自定义返回字段的类型,如:
this.getSession()
.createSQLQuery(“select id,name,state from tb”)
.addScalar(“id”, Hibernate.STRING)
.addScalar(“name”, Hibernate.STRING)
.addScalar(“state”, Hibernate.STRING)
.list();
这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦;