2017-08-30 54 views
1

我們正在使用Spring數據JPA與Hibernate一起開發Web應用程序。如何爲Hibernate的Spring數據JPA的所有查找方法添加全局where子句?

在應用程序中,每個實體都有一個compid字段。 這意味着在每個數據庫調用(Spring Data方法)中都必須使用compid進行檢查。

我需要一種方式,這個「在哪裏compid =?」檢查每個查找方法自動注入。 這樣我們就不必特別麻煩compid檢查。

這是可以實現從Spring Data JPA框架?

回答

0

可能是Hibernate的註釋@Where會幫到你。它給任何JPA查詢添加了一個給定的條件。例如

@Entity 
@Where(clause = "isDeleted='false'") 
public class Customer { 
    //... 
    @Column 
    private Boolean isDeleted; 
} 

更多信息:12

+0

感謝您的回覆, 但在@Where註解我必須將其添加到每個實體類。我想避免這種機制。 可以這樣做嗎? 其中 repo.findAll(); – Zeeshan

+0

您是否擁有所有這些實體的基礎超類?你可以在那裏移動字段'compid'和'@ Where'註釋... – Cepr0

+0

「通用查詢增加」是一個開放的問題,它是你追求的功能類型,但它沒有取得很大進展https:// jira .spring.io /瀏覽/ DATACMNS-293。我認爲將'@ Where'註釋添加到超類中是最好的選擇 - 因爲它是Hibernate特有的註釋,它不適用於Spring Data存儲庫,因此它需要繼續使用實體。 –

0

像其他人說有這個

一種選擇沒有固定的方法是通過例子來看看查詢 - 從春天的數據文檔 -

Person person = new Person(); 
person.setFirstname("Dave"); 
Example<Person> example = Example.of(person); 

所以,你可以在對象默認compid,或父JPA對象

另一種選擇是自定義存儲庫

0

同意Abhijit Sarkar。

您可以實現您的目標hibernate偵聽器和方面。我可以建議以下內容: 創建註釋@Compable(或其他任何你稱之爲)來標記服務方法 創建CompAspect,它應該是一個bean並且@Aspect。它應該有這樣的東西

@Around("@annotation(compable)")` 
    public Object enableClientFilter(ProceedingJoinPoint pjp, Compable compable) throws Throwable { 
     Session session = (Session) em.getDelegate(); 
     try { 
      if (session.isOpen()) { 
       session.enableFilter("compid_filter_name") 
         .setParameter("comp_id", your_comp_id); 
      } 
      return pjp.proceed(); 
     } finally { 
      if (session.isOpen()) { 
       session.disableFilter("filter_name"); 
      } 
     } 
    } 

em - EntityManager 

3)你也需要提供休眠過濾器。如果你使用註釋這可以是這樣的:

@FilterDef(name="compid_filter_name", [email protected](name="comp_id", type="java.util.Long")) 
@Filters(@Filter(name="compid_filter_name", condition="comp_id=:comp_id")) 

所以你的病情where compid = ?@Service方法如下

@Compable 
    someServicweMethod(){ 
    List<YourEntity> l = someRepository.findAllWithNamesLike("test"); 
    } 

這基本上爲選擇, 對於更新/刪除該方案需要一個EntityListener

相關問題