2013-08-23 48 views
13

我不想硬編碼常量值,我寧願通過引用變量指定它們。有沒有辦法在Spring Data @Query註釋值中使用常量?

例如,而不是寫一個查詢:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1") 

..我想提取硬編碼的值「1」,寫的東西,如:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = UserModel.STATUS_ACTIVE") //doesn't compile 

是否有辦法在彈簧數據查詢中指定常量,如第二個示例中那樣?

回答

5

我會建議創建一個Enum和該實體上的枚舉字段。

public enum UserModelStatus{ 
    ACTIVE, INACTIVE 
} 

public UserModel{ 

    /* Other fields ommitted */ 

    @Enumerated(EnumType.STRING) 
    private UserModelStatus status; 

    /* Get/Set Method */ 
} 

然後創建你的倉庫方法:

@Repository 
public interface UserModelRepository extends JpaRepository<UserModel, Long>{ 

    public List<UserModel> findByStatus(UserModelStatus status); 

} 

使用Spring的數據,你甚至不需要寫JPQL只需要調用類的方法:

@Autowired 
    UserModelRepository userModelRepository; 

    public void someMethod(){ 
     List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE); 
    } 
+1

如何我可以輕易否定findByStatus(UserModelStatus狀態)嗎?我的意思是獲取所有userModel其中UserModelStatus是**不**狀態? – stratosgear

+1

findByStatusNot(UserModelStatus狀態) –

+0

這顯示了彈簧數據的全部功能。堅持它來進行簡單的查詢,不需要自己編寫sql。 – membersound

1

當你要使用常量直接在@Query註釋中,您可以編寫如下內容:

@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE) 
+9

這將返回一個錯誤,指出屬性值必須是常量。 – Cleankod

+0

這就是我所說的。這個答案是關於在@Query註釋中使用常量的。 – h3nrik

+1

是的,但CONSTANT + CONSTANT不再是常數:)因此錯誤。 – Cleankod

13

你必須使用完全合格的類名是這樣的:

@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE") 

壞事它雖然是一個IDE不會承認這個作爲類的usermodel的用法。唯一的好處是您可以將價值保留在一個地方,這在大多數情況下都是足夠的。

+1

這引發了'com not defined'的例外情況..至少對於我的 – bert

+0

您是否已將完全合格的軟件包名稱用於您的目的?我的意思是你必須用完全合格的名字指向正確的,現有的類。 – Cleankod

+0

是的,我做到了。我通過枚舉值進行比較來解決問題。不起作用 – bert

0

對於標準解決方案,答案似乎是「否」。

一些JPA實現可能有他們自己的解決方案,但對於一個似乎並不支持任何其他答案建議的方法。

2

使用方法如下:

在倉庫接口,定義一個常量如下:

public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE; 

現在你可以使用

@Query(value=USER_QUERY) 
0

我已經成功地使用類字符串常量在通過SpEL T()運算符進行查詢時,可以訪問給定類的靜態方法和常量。對於字符串,我必須用單引號(')包裝表達式,可能也需要你(如果發生QuerySyntaxException)。

嘗試這樣的事情,

@Query("SELECT u FROM #{#entityName} u " + 
     "WHERE u.status = #{T(fully.qualified.path.UserModel).STATUS_ACTIVE}") 

注:不知何故,如果你使用的usermodel代替#{#entityName}的這是行不通的。

在文檔的簡單提到,請參閱:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#expressions-beandef-xml-based

不知道從什麼時候起,這是支持的,我有彈簧數據的JPA 1.4.3,彈簧框架3.2.17

相關問題