簡體   English   中英

有沒有辦法在 Spring Data @Query 注釋值中使用常量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM