JPQL全称Java Persistence Query Language

基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

select name ,age from user; //原生SQL语句

select u.name,u.age from User u; //JPQL语句

select u from User u; //JPQL语句

SQL语句是在数据库空间中对字段,列,行进行操作

JPQL语句是在EJB实体空间中面向对象,属性进行操作

JPQL必须由JPA的JPQL解析器解析为SQL才能执行,必须先获取Query对象

参数查询

1命名参数查询

entityManager.createQuery(“select u from User u where u.age=:param”);

query.setParameter(“param”,24);

List result=(List)query.getResultList();

2位置参数查询

“select u from User u where u.age=?1”

query.setParameter(1,24);

3实体参数(JPQL中除了基本类型外,还可以是对象类型)

“select u from User u where u.person=?1”

Person p=new Person();

p.setId(1);

query.setParameter(1,p);

JPQL运算符

算术运算符 + - * /

关系运算符 = > < >= <= <>

逻辑运算符 between ,like , in , is null,is empty,member of,not ,and ,or

1 not

“select u from User u where not(u.cityid=?1)”

2 between和sql中一样

3 in 在给定的值列表中查询

“select u from User u where u.cityid in(1,2,3)”

4 like ( _ 表示一个字符,%表示任意数量字符 )

xxxx where u.name like ’ 张% ‘

5 is null (实体的属性是否为空,即实体属性映射的字段是否为空)

“select u from User u where u.cityid is null”

6 is empty (与is null 不同的是,它针对实体的集合属性 内有没有元素。

                       虽然集合对象是存在的,但是集合内没有元素)

select o from Order o where o.orderItems is empty

条件查询

1排序查询 asc升序 desc降序

order by p.age desc,p.birthday asc

2聚合函数查询

avg() 平均值,返回Double count()返回Long max() min() sum()

以上除了count外其它的函数的参数对应的是 单个的字段,即属性而不是对象

HAVING和WHERE的区别。一个是先分组,再对组进行筛选;一个是先筛选,然后对筛选后的记录进行分组。

构造器查询

“select new com.jsun.Person(p.name) from Person p”

Person有这个构造器时,即Person(String name),成功返回对象。

关联查询(实际工作中仍然会有这种需求)

left join 允许右边实体表达式的实体为空,这里的实体指 集合属性

inner join 右边必须存在

“select o from Order o inner join o.orderItems”

在默认查询中,集合属性是懒加载的。只有用的时候JPA才会再发SQL语句

在查询的时候我们希望一次全抓取出来怎么办?用 fetch

(其实left join和inner join在这里使用主要是为了配合fetch,一次抓取,因为默认的是懒加载)

“select o from Order o inner join fetch o.orderItems”

排除相同记录DISTINCT

select distinct o from Order o

(还可以配合聚合函数使用)

如 select count(distinct o) from Order o

JPQL内置函数

字符串函数

concat(str1,str2)

substring(string,position,length)

trim( [leading | trailing | both] sub_str from str)

upper(str)

lower(str)

length(str)

locate(searchString,initPosition)

日期,时间函数

CURRENT_DATE //返回当前日期(这是数据库端的时间)

CURRENT_TIME //返回当前时间

CURRENT_TIMESTAMP //返回当前日期时间

数学函数

ABS(number) //绝对值

SQRT(number) //平方根

MOD(num,div)//取模

SIZE(collection) //返回集合中元素的数量

如:select o from Order o where size(o.items)>10

使用子查询

xxxx in(子查询)

xxxx not in(子查询)

exists(子查询)

not exists(子查询 ) exists存在的意思 即子查询的结果不为空就是存在

分页查询

用到了query接口的两个方法

setMaxResults(int) //设置获取多少条记录

和setFirstResult(int)//结果集开始的索引,索引默认从0开始

以上两个方法都返回Query对象所以可以组成方法链

query.setMaxResults(max).setFirstResult(index).getResultList()

批量操作(批量更新和批量删除)

建议将所有批量操作与不连续的事务隔离开,

批量操作可能造成受管实体与数据库的不一致

原生SQL查询与调用存储过程(EJB3.0不支持以OUT参数的形式返回的存储过程)

Query query=entityManager.createNativeQuery(” {call pro_1(?)} “);

query.setParameter(1,”jsun”);

//无返回值存储过程

query.executeUpdate();

//返回单个值的存储过程

String result=(String)query.getSingleResult();

//返回全部列的存储过程

List results=(List)query.getResultList();

//返回部分列的存储过程

List

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值