2016-03-04 25 views
9

我正在嘗試遷移該應用程序。我正在致力於從Hibernate到Spring Data Jpa春季數據jpa - 如何合併多個And和或通過方法名稱

儘管spring數據jpa爲查詢構建提供了簡單的方法,但我堅持創建同時使用AndOr operator的查詢方法。

方法名 - findByPlan_PlanTypeInAndSetupStepIsNullOrStepupStepIs(...)

當把它轉換成該查詢,所述第一組合兩個表達式,並將其作爲執行[(exp1 and exp2) or (exp3)]

而需要的是](exp1) and (exp2 or exp3)]

任何人都可以請讓我知道這是可以實現的,通過Spring data jpa?

回答

2

選項1:你可以使用命名查詢(見Using JPA Named Queries):

@Entity 
@NamedQuery(name = "User.findByEmailAddress", 
    query = "select u from User u where u.emailAddress = ?1") 
public class User { 

} 

public interface UserRepository extends JpaRepository<User, Long> { 

    User findByEmailAddress(String emailAddress); 
} 

1選項:使用@Query寫您的自定義查詢(請參閱Using @Query

public interface UserRepository extends JpaRepository<User, Long> { 

    @Query("select u from User u where u.emailAddress = ?1") 
    User findByEmailAddress(String emailAddress); 
} 
+0

感謝您的回覆!使用NamedQuery或Query的唯一缺點是當同一個repo類中存在多個連接查詢時,它使得該類看起來很雜亂:( –

+0

但是再次,您的方法名稱不會看起來雜亂並且難以閱讀?從方法名派生查詢對於簡單的查詢很方便 - 在某些時候,你應該切換到「@ Query」或類似的東西。 – fateddy

1

目前不可能,也不會在未來。我認爲,即使有可能,使用更復雜的查詢,您也不希望人爲地將所有查詢複雜性壓縮到方法名稱中。不僅因爲很難消化查詢中實際發生的事情,而且從客戶端代碼的角度來看:您希望使用表達式方法名稱,在簡單findByUsername(…)的情況下,查詢派生允許您創建。

對於更復雜的東西,您只是將查詢複雜性提升到調用代碼中,而且建議更換爲可讀方法名稱,該名稱在語義上表達查詢的功能,並在手動聲明的查詢中使用@Query,命名查詢等。

6

與奧利弗同意長且無法讀取方法的名稱,但仍然和論證起見,你可以通過使用等效

A /\ (B \/ C) <=> (A /\ B) \/ (A /\ C) 
A and (B or C) <=> (A and B) or (A and C) 

所以你的情況應該是這個樣子達到期望的結果: findByPlan_PlanTypeInAndSetupStepIsNullOrPlan_PlanTypeInAndStepupStepIs(...)

+0

這基本上工作 - 但是:如何避免與方法重複的變量?(如果可能的話所有....) – Trinimon

+0

是的,這有效...它看起來像你不能避免重複的參數我用一個外觀方法來隱藏尷尬的方法簽名 – kiedysktos