| 
          
         | 
         
          
          
          本文参考《精通JPA与Hibernate:Java对象持久化技术详解》,作者:孙卫琴,清华大学出版社出版。 
 
JPA的JPQL(JPA Query Language,JPA查询语言)不仅可以检索数据,还可以用于进行批量更新、删除和插入数据。批量操作实际上直接在数据库中完成,所处理的数据不会被保存在Session的持久化缓存中,因此不会占用内存空间。  
Query.executeUpdate()方法和JDBC API中的PreparedStatement.executeUpdate()很相似,前者执行用于更新、删除和插入的JPQL语句,而后者执行用于更新、删除和插入的SQL语句。 
1.批量更新数据 
 
以下程序代码演示通过JPQL来批量更新Customer对象: 
tx = entityManager.getTransaction(); 
tx.begin(); 
 
String jpqlUpdate ="update Customer c set c.name = :newName" 
                  +" where c.name = :oldName"; 
int updatedEntities = entityManager.createQuery( jpqlUpdate ) 
        .setParameter( "newName", "Mike" ) 
        .setParameter( "oldName", "Tom" ) 
        .executeUpdate(); 
 
tx.commit(); 
entityManager.close(); |  
  以上程序代码向数据库发送的SQL语句为: 
 
| update CUSTOMERS set NAME="Mike" where NAME="Tom" |  
  除了使用JPQL,还可以使用HQL(Hibernate Query Language,Hibernate查询语言)以及Hibernate API来进行批量更新。HQL语言和JPQL语言的语法几乎是相同的: 
 
 
Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
 
String hqlUpdate ="update Customer c set c.name = :newName" 
                  +" where c.name = :oldName"; 
int updatedEntities = session.createQuery( hqlUpdate ) 
        .setParameter( "newName", "Mike" ) 
        .setParameter( "oldName", "Tom" ) 
        .executeUpdate(); 
 
tx.commit(); 
session.close(); |  
  2.批量删除数据 
 
EntityManager的remove()方法一次只能删除一个对象,不适合进行批量删除操作。以下程序代码演示通过JPQL来批量删除Customer对象: 
 
 
tx = entityManager.getTransaction(); 
tx.begin(); 
 
String jpqlDelete = "delete Customer c where c.name = :oldName"; 
int deletedEntities = entityManager.createQuery( jpqlDelete ) 
        .setParameter( "oldName", "Tom" ) 
        .executeUpdate(); 
 
tx.commit(); 
entityManager.close(); |  
  以上程序代码向数据库提交的SQL语句为: 
delete from CUSTOMERS where NAME="Tom" 
 
3.批量插入数据 
 
插入数据的JPQL语法为: 
insert into EntityName properties_list select_statement 
 
以上EntityName表示持久化类的名字,properties_list表示持久化类的属性列表,select_statement表示子查询语句。 
 
JPQL只支持insert into ... select ... 形式的插入语句,而不支持“insert into ... values ... ”形式的插入语句。  
下面举例说明如何通过JPQL来批量插入数据。假定有DelinquentAccount类和Customer类,它们都用@Entity注解等进行了对象-关系映射。它们都有id和name属性,与这两个类对应的表分别为DELINQUENT_ACCOUNTS和CUSTOMERS表。以下代码能够把CUSTOMERS表中的数据复制到DELINQUENT_ACCOUNTS表中: 
 
 
tx = entityManager.getTransaction(); 
tx.begin(); 
 
String jpqlInsert = "insert into DelinquentAccount (id, name) " 
        +"select c.id, c.name from Customer c where c.id>1"; 
 
int createdEntities = entityManager.createQuery( jpqlInsert ) 
                             .executeUpdate(); 
 
tx.commit(); 
entityManager.close();	 |  
  以上程序代码向数据库提交的SQL语句为: 
 
insert into DELINQUENT_ACCOUNTS(ID,NAME)  
select ID,NAME from CUSTOMERS where ID>1 |  
  程序猿的技术大观园:www.javathinker.net 
 
 
          
          
          
            
  
            [这个贴子最后由 admin 在 2021-10-09 10:50:07 重新编辑]
          
          
         | 
        
      
 
          |