EJB3Persistence开发手册-原生SQL查询(NativeSQL)

EJB3 QL对原生SQL做了非常好的支持。采用原生SQL做查询结果不但可以是象SQL中的返回列值,也可以是Entity类,甚至可以是两者的混合。

EJB3 EntityManager接口定义了多个原生SQL的产生方法。

  • public Query createNativeQuery(String sqlString);
  • public Query createNativeQuery(String sqlString, Class resultClass);
  • public Query createNativeQuery(String sqlString, String resultSetMapping);

一个简单的SQL查询:

    
     Query query = entityManager.createNativeQuery("select o.id, o.vender as vender from OrderTable");
         
     // 集合中的每个元素是一个数组,代表一行返回列值,每一个数具有2个元素,分别是id列,vender列
     List result = query.getResultList();
     Object[] row1 = (Object[])result.get(0);
                    
     


在原生SQL中使用参数和EJB3 QL中使用参数的方法一致,但只支持位置参数。

 

   
     Query query = entityManager.createNativeQuery("select o.id, o.vender as vender from OrderTable where o.id = ?1");
     query.setParameter( 1, 200 );
     
     // 集合中的每个元素是一个数组,代表一行返回列值,每一个数具有2个元素,分别是id列,vender列
     List result = query.getResultList();
     Object[] row1 = (Object[])result.get(0);
                
     

  除了象上面例子中直接返回查询结果的列值,我们可以让EJB3 Persistence运行环境将列值直接填充入一个Entity的实例,并将实例作为结果返回。

     
    
    // 我们这里将结果定义为Entity类Order的实例
    Query query = entityManager.createNativeQuery("select o.id, o.vender, o.partId from OrderTable o order by o.amount desc",
                                                  Order.class);
    // 结果集合中是Order类的实例,但Order实例只有id, vender, partId三列对应的属性变量有值,其他的变量属性为空。
    List result = query.getResultList();
    Order order1 = (Order)result.get( 0 );
posted @ 2015-11-06 14:57  tian830937  阅读(552)  评论(0编辑  收藏  举报