我們正在使用Spring數據JPA與Hibernate一起開發Web應用程序。如何爲Hibernate的Spring數據JPA的所有查找方法添加全局where子句?
在應用程序中,每個實體都有一個compid字段。 這意味着在每個數據庫調用(Spring Data方法)中都必須使用compid進行檢查。
我需要一種方式,這個「在哪裏compid =?」檢查每個查找方法自動注入。 這樣我們就不必特別麻煩compid檢查。
這是可以實現從Spring Data JPA框架?
我們正在使用Spring數據JPA與Hibernate一起開發Web應用程序。如何爲Hibernate的Spring數據JPA的所有查找方法添加全局where子句?
在應用程序中,每個實體都有一個compid字段。 這意味着在每個數據庫調用(Spring Data方法)中都必須使用compid進行檢查。
我需要一種方式,這個「在哪裏compid =?」檢查每個查找方法自動注入。 這樣我們就不必特別麻煩compid檢查。
這是可以實現從Spring Data JPA框架?
像其他人說有這個
一種選擇沒有固定的方法是通過例子來看看查詢 - 從春天的數據文檔 -
Person person = new Person();
person.setFirstname("Dave");
Example<Person> example = Example.of(person);
所以,你可以在對象默認compid,或父JPA對象
另一種選擇是自定義存儲庫
同意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
。
感謝您的回覆, 但在@Where註解我必須將其添加到每個實體類。我想避免這種機制。 可以這樣做嗎? 其中 repo.findAll(); – Zeeshan
您是否擁有所有這些實體的基礎超類?你可以在那裏移動字段'compid'和'@ Where'註釋... – Cepr0
「通用查詢增加」是一個開放的問題,它是你追求的功能類型,但它沒有取得很大進展https:// jira .spring.io /瀏覽/ DATACMNS-293。我認爲將'@ Where'註釋添加到超類中是最好的選擇 - 因爲它是Hibernate特有的註釋,它不適用於Spring Data存儲庫,因此它需要繼續使用實體。 –