查询语句的参数:

命令参数的格式为:“: +参数名”

例:

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 
     ;
 
    
}
 
    
}