[转] JPQL
原文地址:http://blog.csdn.net/suncaishen/article/details/6512028
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<User> result=(List<User>)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<User> results=(List<User>)query.getResultList();
//返回部分列的存储过程
List<Object[]> results=(List<Object[]>)query.getResultList();
for(Object[] row:results){
row[0],row[1]
}
[转] JPQL的更多相关文章
- Atitit oodbms的查询,面向对象的sql查询jpa jpql hql
Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...
- JPA学习(6)JPQL
JPQL语言,即 Java Persistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查 ...
- JPA学习---第八节:使用JPQL语句进行查询
1.JPQL 语句查询,代码如下: @Test public void query(){ EntityManagerFactory factory = Persistence.createEntity ...
- JavaEE(17) - JPA查询API和JPQL
1. 获取查询结果 2. JPQL函数和JPQL表达式 #1. 使用from子句 #2. 查询部分属性 #3. 查询中使用构造器 3. JPQL的关联查询和多态查询 #1. 多态查询 #2. 隐式连接 ...
- JPQL
JPQL语言 JPQL语言,即 Java Persistence Query Language 的简称. JPQL是一种和 SQL 非常类似的中间性和对象化查询语言, 它最终会被编译成针对不同底层数据 ...
- 如何使用JPQL写纯SQL语句
使用JPQL,需要把SQL语句修改成类似HQL 语句.SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的.对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便 ...
- JPQL的关联查询
一般情况下,直接使用mysql语句写关联语句,是join on 的形式,如下: select * from tablea as a left join tableb as b on b.tablea_ ...
- JPQL设置自增长、只读、文本类型等的注解
JAVA中使用JPQL 一种设置id自动生成,自增长的方法 private long id; @Id @GeneratedValue(generator="_native") @G ...
- JPQL模糊匹配单个字符
JPQL模糊匹配,不是%,而是单个字符,该怎么办?比如我要查出数据库中满足后三位是数字的字符串 对于mysql来说,使用通配符 %和_可以轻松解决,但是对于JPQL来说模糊查询就伤脑筋了... 有一个 ...
随机推荐
- ZBrush中文版ZBrushCore震撼来袭
北京时间2016年9月30日,Pixologic公司召开新闻发布会,宣布ZBrush精简版ZBrushCore正式发布.该版本不仅支持中文,还支持多国语言,包括法语.西班牙语等.简单点来说,ZBrus ...
- 分布式系统理论之Quorum机制
一,Quorum机制介绍 在分布式系统中有个CAP理论,对于P(分区容忍性)而言,是实际存在 从而无法避免的.因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区.网络通信故障问 ...
- AC日记——数字统计 openjudge 1.5 41
41:数字统计 总时间限制: 1000ms 内存限制: 65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...
- 对RTMP视频流进行BitmapData.draw()出错的解决办法
source on github 在对Flash Media Server中的视频流使用BitmapData.draw()进行绘制的时候,会抛出这样异常: cannot access rtmp://x ...
- 虚拟机安装的UBUNTU怎么全屏
虚拟机下面安装了ubuntu系统,显示的屏幕只有那么一小块儿,不知道如何才能全屏,那么如何全屏呢?且看下面经验. 步骤阅读 百度经验:jingyan.baidu.com 方法/步骤 1 打开虚拟机 ...
- [No000026]365种创业、办公、和生活成长的精华资源
只需要具备以下技能,人人都可以成为企业家:经得起失败的考验,思维活跃,新点子不断,能够脚踏实地把新点子转化为产品,并在这个过程中坚持不懈,百折不挠,即使跌倒了,也要及时从失败中学习,迅速投入到下一次冒 ...
- 基于jquery的tips悬浮消息提示插件tipso
<a href="javascript:;" class="disabled" data-tipso="Tips" id=" ...
- 02Spring_Ioc和DI介绍
什么是IOC? IoC: 控制反转, 解决程序对象紧密耦合问题(工厂+反射+ 配置文件), 将程序中原来构造对象的权限,交给IoC容器来构造,当程序需要对象,找IoC容器获取.
- C#命名空间的嵌套
namespace abc.e.f//等价于下面分层嵌套的写法.且这种写法不管命名空间abc有没有定义过,也不管命名空间e有没有定义过 { class ctest { public void func ...
- python中from module import * 的一个陷阱
from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...