jpa中如何一次提交多条jpql操作啊?开发文挡里写的和我想的不一样!新手多多指教!

解决方案 »

  1.   

    批量处理(BULK OPERATIONS)
    JPQL提供了一种替代方案,用一条语句更新或删除一个或多个实体。JPQL中批处理支持一次可以处理一个实体类型(和它的子类)。也就是说,你只能在FROM或UPDATE指定唯一实体。这里是一个UPDATE查询的语法。UPDATE abstract_persistence_scheama_name [AS] identification_variableSET state_field | single_value_association_field = value{,state_field | single_value_association_field = value }*
    value引用必须与你要更新的状态字段或是单值关联字段的类型相同。你可以将下列任意值用于value。一个算术表达式字符串时间日期(datetime)布尔值(boolean)枚举类型(enum)简单实体表达式NULLDELETE语句看起来如下。DELETE FROM abstract_persistence_scheama_name [[AS] identification_variable][WHERE clause]
    WHERE语句的语法与SELECT相同(更多信息参见SELECT语句一节)。DELETE操作符只影响FROM语句指定的实体及其子类。此操作不会级联到任何相关的实体。此外,UPDATE操作符不更新实体的version一列。批处理操作最终转换成SQL并在数据库中执行,绕过了持久化环境(persistence context)。当使用一个事务作用域(transaction-scoped)的持久化环境,会在它们所在事务内执行或在一个事务开始时执行。批量操作和扩展的持久化环境(extended persistence context)的组合在管理上有所不同。因为一个扩展持久化环境不会与数据库同步,直到参与到一个事务中去,你可以有一些实体已经删除了,但仍可能存在于持久化环境中。持久化实现通常会在执行批处理操作前禁用一些缓存功能。基于不同的实现,部分或全部缓存功能会被禁用。频繁的使用批处理操作会影响应用程序的性能。基于这些原因,你应该在它们自己的事务内或是一个事务开始时执行批处理操作。实例
    当你使用一个UPDATE或是DELETE查询时,你一定会用到Query API提供的方法--executeUpdate(),来执行更新或是删除操作。如果你使用getResultList()或getSingleResult(),持久化实现会抛出一个IllegalStateException 异常。同样,你用executeUpdate()来执行一个SELECT查询,持久化实现会抛出一个IllegalStateException 异常。下面是一些批量更新的例子。一个论坛帖子数量的两倍。Query q2 = em.createQuery("UPDATE Forum AS f "+"SET f.forumPostCount = f.forumPostCount * 2");q2.executeUpdate();
    将所有的Role实体的dateUpdated字段设置为当前日期和时间。Query q = em.createQuery("UPDATE Role AS r " +"SET r.dateUpdated = CURRENT_TIMESTAMP");q.executeUpdate();
    将布尔字(pruningEnabled))段值设置为true。在agoraBB应用程序中,用EntityListener类来设置dateUpdated和updatedByUser字段。version字段是由持久化实现进行管理。避开这些弯弯角角,当你执行批量操作时,你的查询写成更新字段。还有,要注意的是,executeUpdate返回实体更新的数目(删除时返回删除的数量)。// Assume we already fetched the correct User identified by// the variable adminUserQuery forumUpdate = em.createQuery("UPDATE Forum AS f " +"SET f.pruningEnabled = TRUE, f.dateUpdated = CURRENT_TIMESTAMP, " +"f.version = f.version + 1, f.updatedByUser = :user");forumUpdate.setParameter("user", adminUser);int entitiesUpdated = forumUpdate.executeUpdate();
    你可以将pruningEnabled的值设置为null,将其进行重位。如下所示。Query pruningReset = em.createQuery("UPDATE Forum AS f " +"SET f.pruningEnabled = NULL");pruningReset.executeUpdate();
    这条查询设置了enum类型的字段值。你必须使用enum类的长限定词,因为enum不是实体,持久化实现不法获得Status的信息,但它可以识别com.sourcebeat.jpa.model.Status。Query enumUpdate = em.createQuery("UPDATE Forum AS f " +"SET f.status = com.sourcebeat.jpa.model.Status.LOCKED " +"WHERE f.type = com.sourcebeat.jpa.model.FTPType.ANNONUCEMENT");int enumUpdateCount = enumUpdate.executeUpdate();
    这里有几个DELETE操作的例子。删除系统中所有无密码的用户(Users)。Query removeRoles = em.createQuery("DELETE FROM User u " +"WHERE u.password = NULL");int rolesRemoved = removeRoles.executeUpdate();
    删除没有主题(Topics)的论坛(Forum)。Query removeForums = em.createQuery("DELETE FROM Forum f " +"WHERE f.topics IS EMPTY");int forumsRemoved = removeForums.executeUpdate();
    http://blog.chinaunix.net/u/1096/showart_362406.html