[英]Is there a way to use constants inside Spring Data @Query annotation value?
我不想硬編碼常量值,我寧願通過引用變量指定它們。
例如,而不是編寫下一個查詢:
@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
有沒有辦法在 spring-data 查詢中的第二個示例中指定常量?
您必須像這樣使用完全限定的類名:
@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")
但它的壞處是 IDE 不會將此識別為 UserModel 類的用法。 唯一的優點是您可以將值保存在一個地方,這在大多數情況下就足夠了。 這已在IntelliJ IDEA 2017.1 中解決。 我不知道其他 IDE。
我建議在實體上創建一個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 Data,您甚至不需要編寫 JPQL 只需調用如下方法:
@Autowired
UserModelRepository userModelRepository;
public void someMethod(){
List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE);
}
使用方法如下:
在存儲庫界面中,定義一個常量如下:
public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;
現在你可以使用
@Query(value=USER_QUERY)
我已經設法通過 SpEL T() 運算符在查詢中使用類 String 常量,這使您可以訪問給定類上的靜態方法和常量。 對於字符串,我必須用單引號 (') 包裝表達式,您可能也需要它(如果發生 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
不知道從什么時候開始支持,我有 spring-data-jpa 1.4.3,spring-framework 3.2.17
對於標准解決方案,這個問題的答案似乎是“否”。
一些 JPA 實現可能有自己的解決方案,但一個人的休眠似乎不支持,也不支持此處其他答案建議的任何方法。
當您想直接在 @Query 注釋中使用常量時,您可以編寫如下內容:
@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)
是的,這是一種更優雅的方式,它也具有可讀性。 例如:
@Query("SELECT xyz.id FROM XYZ AS xyz WHERE xyz.status = " + Status.OPEN + " AND xyz.active=1")
這里, Status
是一個包含靜態常量的簡單類:
public class Status {
public static final int OPEN = 1;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.