簡體   English   中英

Spring數據JPA更新多行

[英]Spring data JPA update multiple rows

目的:通過給定的主鍵列表更新同一表的某些列並返回有序 int[] 以指示行更新是否成功

查詢(非本地):

update MyEntity e set e.col_1 = :v1, e.col_2 = :v2 where e.id in :ids

Spring Data JPA 方法:

@Modifying(clearAutomatically = true)
@Transactional
public int updateCols(@Param("v1") String v1, @Param("v2") String v2, @Param("ids") List<Long> idList);

使用 Spring JpaTransactionManager

問題:1) 僅使用 Spring Data JPA,如何做到這一點? (由於現有代碼量大,自定義repository不可選),我們只想用Spring數據JPA實現相當於JDBC批量更新的效果。

2) spring data JAP 是否有可能通過上面的更新方法返回一個小於輸入列表大小的整數? 如果這可能發生,我們怎么知道我的輸入列表中的哪一個失敗了? 以任何順序?

3)注意到上述方法成功完成后,數據庫行根本沒有更新。 我們如何強制它與帶有 spring 數據 jpa 的數據庫同步?

4)如果實體更新沒有被spring數據JPA刷新,那么即使我們一個一個而不是批量更新,我們仍然看不到數據庫變化嗎? 提前致謝

首先,AFAIK Spring Data JPA 不能單獨存在,它只是建立在裸 JPA 上的東西。 它需要在后台使用 Hibernate 或任何其他 JPA 提供程序。

https://github.com/colonder/Spring-Hibernate-JavaFX-Invoices

看看我的存儲庫。 它是 Hibernate + Spring Boot + Spring Data JPA + Java FX 8,但我認為它會幫助你一點。 我的 repo 遵循 MVC 模式並使用 Spring 事務管理器,就像你的一樣。 關於問題 3 和 4 AFAIK Hibernate(因為這是 Spring Data JPA 在我的情況下用作提供程序的內容)更新數據庫中的行,而不是應用程序中的行。 問題應該是數據庫中更新的行在應用程序中不可見,而不是相反。

@Query("select t from SixxxoView t where t.idbien IN (:idbienes) ")
 public List<SixxxoView> findByIdbienes(
         @Param("idbienes") List<Long> idbienes);

我使用“中”來更新多個行集。

我使用查詢更新user_Record設置email =:uname,其中(“ + id +”)中的id用於更新表user_data中的數據

CREATE TABLE user_record ( id VARCHAR(50) NOT NULL COLLATE 'utf16_bin',電子郵件VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf16_bin',名稱VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf16_bin', PRIMARY KEY ( id ) )

@RequestMapping(value = "/updateSums/{id}", method = RequestMethod.GET) 
public String updateFew(@PathVariable String id ,Model model)
{
    EntityManager em = entityManagerFactory.createEntityManager();
    id= id.replace(",", "','");
    id= "'"+id+"'";
    em.getTransaction().begin();
    System.out.println( );
     em.createNativeQuery("update user_Record set email= :uname  where id in ("+id+")", UserRecord.class)
            .setParameter("uname", "shaktimaan@gangadhar.tv")
            .executeUpdate()
            ;

    em.getTransaction().commit();

    return "user_one";
}

終端登錄這張照片

希望它能為您服務!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM