Hibernate查询语言(HQL)和Java Persistence查询语言(JPQL)都是对象模型,它们都将查询语言与SQL类似。JPQL是HQL的子集。JPQL查询始终是一个有效的HQL查询,但反过来则不一定成立。
HQL和JPQL都是非类型安全的执行查询操作的方法。Criteria查询提供了一种类型安全的查询方法
1、JPA Query
通过EntityManager取得javax.persistence.Query 或javax.persistence.TypedQuery。
主要接口
Query : 基本的查询对象
TypedQuery : Query的子接口,类型化的查询对象,支持泛型,推荐使用类型化查询
JPQL/HQL
from子句:from 后面可以直接跟着类名,别名不是必须的,where语句就必须在from的后面。
Select子句:查询一个实体对象的时候,不需要select子句
select 别名 from 类名 别名 where 条件
select 别名.属性 from 类名 别名 where 条件
(1)基本查询
Query query = super.entityManager.createQuery("from ArticleType");
List<?> list = query.getResultList();//获取查询结果集合
(2)带参数的查询
在JPQL/HQL里面,参数如果是 : 开头的 表示【命名参数】,不能用【数字】给参数赋值,而是要使用名字
如果就是要使用数字来设置参数,则把命名参数改为 ?
(3)使用构造器查询
select new 类名(别名.属性,别名.属性) from类名别名
构造器的这种查询使用较少,把查询出来的部分属性,通过类的构造器传入给对象,创建类名对应的对象。
构造器必须要有【无参构造器】,否则其他创建对象,存储对象到数据库的语句会出问题。以及select的时候new所需要的匹配构造器!
有多个User类的情况下应写全限定类名。
2、Hibernate Query
通过 Session 获取 org.hibernate.query.Query。
除了创建Query对象以及取得结果与JPA不一样,其余设置参数一致
org.hibernate.query.Query query = session.createQuery(...);
3、函数
count
min
max
sum
avg
标量函数
Concat 字符串连接
SUBSTRING 截取字符串
UPPER 转换为大写
LOWER 转换为小写
TRIM 去掉头尾空格
LENGTH 属性内容的长度
LOCATE 接收两个参数,定位第一个参数的内容,在第二个参数的位置,类似于String里面的indexOf方法。
ABS 绝对值
MOD 求余
SQRT 平方根
CURRENT_DATE 当前日期,没有时分秒
CURRENT_TIME 当前时间,没有年月日
CURRENT_TIMESTAMP 当前日期、时间
注意:虽然HQL/JPQL大部分的函数、查询方式,都跟SQL差不多,只是在HQL/JPQL里面不能使用数据库的字段,只能使用类里面的【属性名】。
eg:
String hql = "select sum(o.number) from OrderItem o where o.order=:order";
String hql = "select size(o.items) from Order o where o.id=:id";
String hql = "select MAXELEMENT(o.items) from Order o where o.id=:id";
4、本地的SQL语句(Native SQL Queries)
不推荐使用。查询结果默认是Object[],可以通过addScalar指定不同的列,返回特定的数据类型。