JPA查询语言 JPQL

查询语句的参数

命令参数的格式为:“: +参数名”
例:
Query query = em.createQuery("select p from Person p where p.personid= :Id");
query.setParameter("Id",new Integer(1));
位置参数的格式为“?+位置编号”
例:
Query query = em.createQuery("select p from Person p where p.personid= ?1");
query.setParameter(1,new Integer(1));

排序(order by)
"ASC"和"DESC"分别为升序和降序,JPQL中默认为asc升序
例:
//先按年龄降序排序,然后按出生日期升序排序
Query query = em.createQuery("select p from Person p order by p.age desc, p.birthday asc");

查询部分属性
通常来说,都是针对Entity类的查询,返回的也是被查询的Entity类的实体。JPQL 也允许我们直接查询返回我们需要的属性,而不是返回整个Entity。在一些Entity中属性特别多的情况,这样的查询可以提高性能
例:
//只查询我们感兴趣的属性(列)
Query query=em.createQuery("select p.personid, p.name from Person p order by p.personid desc ");
//集合中的元素不再是Person,而是一个Object[]对象数组
List result = query.getResultList();
if (result!=null){
Iterator iterator = result.iterator();
while( iterator.hasNext() ){
Object[] row = ( Object[]) iterator.next();
int personid = Integer.parseInt(row[0].toString());
String PersonName = row[1].toString();
}
}
查询中使用构造器(Constructor)
JPQL支持将查询的属性结果直接作为一个java class的构造器参数,并产生实体作为结果返回。例如上面的例子只获取person entity bean的name and personid属性,我们不希望返回的集合的元素是object[],而希望用一个类来包装它。就要用到使用构造器。
例:
public class SimplePerson {
 private Integer personid;
private String name;
   。。。。
public SimplePerson() {
}
public SimplePerson(Integer personid, String name) {
this.name = name;
this. personid = personid;
}
}
 
查询代码为:
//我们把需要的两个属性作为SimplePerson的构造器参数,并使用new 函数。
Query query = em.createQuery(" select new com.foshanshop.ejb3.bean.SimplePerson(p. personid, p.name) from Person p order by p.personid desc");
//集合中的元素是SimplePerson 对象
List result = query.getResultList();
if (result!=null){
Iterator iterator = result.iterator();
while( iterator.hasNext() ){
SimplePerson simpleperson = (SimplePerson) iterator.next();
}
}
聚合查询(Aggregation)
JPQL支持的聚合函数包括:
1. AVG()
2. SUM()
3. COUNT(),返回类型为Long,注意count(*)语法在hibernate中可用,但在toplink 其它产品中并不可用
4. MAX()
5. MIN()
例:
//获取最大年龄
Query query = em.createQuery("select max(p.age) from Person p");
Object result = query.getSingleResult();
String maxAge = result.toString();
//获取平均年龄
query = em.createQuery("select avg(p.age) from Person p");
//获取最小年龄
query = em.createQuery("select min(p.age) from Person p");
//获取总人数
query = em.createQuery("select count(p) from Person p");
//获取年龄总和
query = em.createQuery("select sum(p.age) from Person p");
如果聚合函数不是select...from的唯一一个返回列,需要使用"GROUP BY"语句。"GROUP BY"应该包含select 语句中除了聚合函数外的所有属性。
例:
//返回男女生各自的总人数
Query query = em.createQuery("select p.sex, count(p) from Person p group by p.sex");
//集合中的元素不再是Person,而是一个Object[]对象数组
List result = query.getResultList();
 
如果还需要加上查询条件,需要使用"HAVING"条件语句而不是"WHERE"语句
例:
//返回人数超过1人的性别
Query query = em.createQuery("select p.sex, count(p) from Person p group by p.sex having count(*)>?1");
//设置查询中的参数
query.setParameter(1, new Long(1));
//集合中的元素不再是Person,而是一个Object[]对象数组
List result = query.getResultList();
关联(join)
JPQL仍然支持和SQL中类似的关联语法:
left out join/left join
inner join
left join fetch/inner join fetch
结果集分页
有些时候当执行一个查询会返回成千上万条记录,事实上我们只需要显示一部分数据。这时我们需要对结果集进行分页 QueryAPI 有两个接口方法可以解决这个问题: setMaxResults( )  setFirstResult( )
setMaxResults 方法设置获取多少条记录
setFirstResult 方法设置从结果集中的那个索引开始获取 (假如返回的记录有 3 条,容器会自动为记录编上索引,索引从 0 开始,依次为 0 1 2
例:
public  List getPersonList( int  max, int  whichpage) {
try  {
int  index = (whichpage-1) * max;
Query query =  em .createQuery( "from Person p order by personid asc" );
List list = query. setMaxResults(max) . setFirstResult(index). getResultList();
em .clear(); // 分离内存中受EntityManager管理的实体bean,让VM进行垃圾回收
return  list;
}  catch  (Exception e) {
e.printStackTrace();
return null ;
}
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值