2015-07-10 127 views
10

我想在我的資源庫中創建一個自定義的deleteBy方法查詢。 看來,而不是刪除,休眠正在做一個選擇語句。春季數據jpa deleteBy查詢不起作用

public interface ContactRepository extends JpaRepository<Contact, Integer> { 

    Integer deleteByEmailAddress(String emailAddress); 

    //and this one works 
    Contact findContactByName(String name); 
} 

,這裏是什麼休眠正在試圖做的事:

休眠:選擇contact0_.id爲id1_2_,contact0_.emailAddress爲> emailAdd2_2_,contact0_.name從聯繫name3_2_ contact0_哪裏> contact0_ .emailAddress =?

我錯過了什麼?我是否必須進行特殊配置才能進行刪除工作?

回答

19

刪除無法正常工作或無法按照您的預期工作?通常,一個實體在被刪除之前必須進行管理,因此JPA提供程序(在您的情況下爲hibernate)將首先加載(您看到的查詢)該實體,然後發出刪除。

如果你只看到了查詢,但沒有相應的刪除,然後一些可能性:

  1. 沒有什麼刪除,確保記錄有在DB
  2. 刪除需求成爲交易的一部分。我相信春天數據CRUD OPS是通過默認的事務,如果不只是確保無論是打電話deleteByEmailAddress是事務性的

注:使用修改查詢刪除,例如低於刪除實體時可以避開選擇:

// NOTE: you have return void 
@Modifying 
@Transactional 
@Query(value="delete from Contact c where c.emailAddress = ?1") 
void deleteByEmailAddress(String emailAddress) 
+4

它在我用@transactional註解該方法後有效。先生,謝謝你!注意:它也適用於查詢,但我只想要一個功能方法查詢。 –

+1

感謝關於'/ /注意:你已經返回void' - 我會嘗試所有,但沒有想到這一點,這是我的原因! – yetanothercoder

+0

@ikumen查詢工作正常與修改和交易註釋,但在數據庫行仍然存在 – Abhij

4

在現代版本的Spring Data JPA(> = 1.7.x)查詢派生中,刪除,刪除和計數操作是可訪問的。

Spring Data: "delete by" is supported?

+2

這就是我開始的地方,但它不回答我的問題。 –