原文地址: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的更多相关文章

  1. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

    Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...

  2. JPA学习(6)JPQL

    JPQL语言,即 Java Persistence Query Language 的简称.JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查 ...

  3. JPA学习---第八节:使用JPQL语句进行查询

    1.JPQL 语句查询,代码如下: @Test public void query(){ EntityManagerFactory factory = Persistence.createEntity ...

  4. JavaEE(17) - JPA查询API和JPQL

    1. 获取查询结果 2. JPQL函数和JPQL表达式 #1. 使用from子句 #2. 查询部分属性 #3. 查询中使用构造器 3. JPQL的关联查询和多态查询 #1. 多态查询 #2. 隐式连接 ...

  5. JPQL

    JPQL语言 JPQL语言,即 Java Persistence Query Language 的简称. JPQL是一种和 SQL 非常类似的中间性和对象化查询语言, 它最终会被编译成针对不同底层数据 ...

  6. 如何使用JPQL写纯SQL语句

    使用JPQL,需要把SQL语句修改成类似HQL 语句.SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的.对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便 ...

  7. JPQL的关联查询

    一般情况下,直接使用mysql语句写关联语句,是join on 的形式,如下: select * from tablea as a left join tableb as b on b.tablea_ ...

  8. JPQL设置自增长、只读、文本类型等的注解

    JAVA中使用JPQL 一种设置id自动生成,自增长的方法 private long id; @Id @GeneratedValue(generator="_native") @G ...

  9. JPQL模糊匹配单个字符

    JPQL模糊匹配,不是%,而是单个字符,该怎么办?比如我要查出数据库中满足后三位是数字的字符串 对于mysql来说,使用通配符 %和_可以轻松解决,但是对于JPQL来说模糊查询就伤脑筋了... 有一个 ...

随机推荐

  1. MMORPG大型游戏设计与开发(客户端架构 part7 of vegine)

    我在讲述某个东西的时候总喜欢从简单的入手,然后从互相关联的地方联合讲解,因为时间关系所以没能讲的十分详细,这点引以为憾,希望得到大家的谅解.这一节讲述的是微引擎(vengine)比较简单的一个模块,那 ...

  2. 《Remus: High Availability via Asychronous Virtual Machine Replication》翻译

    Abstract 想要让应用能够躲过硬件故障是一项非常昂贵的任务,因为这通常意味着对软件进行重构,使它包含复杂的恢复逻辑的同时需要部署专用的硬件,而这些对于提升大型的或者遗留的应用的可靠性是巨大的障碍 ...

  3. WinCE下GPRS自动拨号软件(GPRS AutoDial)

    之前在WinCE下调试USB的3G Modem时,写过一个拨号助手RASManager,基本能用.后来车机卖到俄罗斯去,客户老M提供了一个更好的GPRS自动拨号软件GPRS AutoDial,功能完善 ...

  4. Vijos1019 补丁VS错误[最短路 状态压缩]

      描述 错误就是人们所说的Bug.用户在使用软件时总是希望其错误越少越好,最好是没有错误的.但是推出一个没有错误的软件几乎不可能,所以很多软件公司都在疯狂地发放补丁(有时这种补丁甚至是收费的).T公 ...

  5. Google Play笔记之上架

    我最近负责Google Play上架的主要工作 ,现已进入开放测试阶段(随后就可全球首发~~).接入工作已完成,这篇记录一下上架后期的笔记. 开放测试 开放测试是指对所有玩家进行开放式测试,玩家可以通 ...

  6. 一行代码远离Google浏览器兼容问题的困扰

    跟Html相比,Web Flash开发的最大优势就在于兼容性好,因为FlashPlayer的开发商只有Adobe一家.但自从Google插了一脚进来,改版出自己的FlashPlayer以后,这一优势就 ...

  7. u3d_shader_surface_shader_3

    参考http://my.oschina.net/u/138823/blog/181131 加了个凹凸贴图: 抱歉把女神苏菲做成这样. 一:Normal Texture的制作: 1.首先是Normal ...

  8. 更改项目名或者多个项目时,发现多个"Home"匹配的Controller时,解决方法

    [备份]异常信息:找到多个与名为“Home”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的 路由在搜索匹配此请求的控制器时没有指定命名空间,则会 ...

  9. bzoj1787 [Ahoi2008]Meet 紧急集合

    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2272  Solved: 1029 [Submi ...

  10. 使用gulp将移动端px转为rem

    使用gulp的插件可以很方便的将xp转为rem,在布局的时候使用@1x .@2x布局,即10rem=device-width:@1x即设计图为320px,1rem对应的10px像素,相对的@2x即为布 ...