有没有办法在Spring Data @Query注释值中使用常量?

Rom*_*man 25 java spring jpql spring-data

我不想硬编码常量值,我宁愿通过引用变量指定它们.

例如,而不是写下一个查询:

@Query(value = "SELECT u FROM UserModel u WHERE u.status = 1")
Run Code Online (Sandbox Code Playgroud)

..我想提取硬编码值'1'并写下如下内容:

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

有没有办法像弹簧数据查询中的第二个例子那样指定常量?

Cle*_*kod 27

您必须使用完全限定的类名,如下所示:

@Query("SELECT u FROM UserModel u WHERE u.status = com.example.package.UserModel.STATUS_ACTIVE")
Run Code Online (Sandbox Code Playgroud)

但它的坏处是IDE不会将其识别为UserModel类的用法.唯一的好处是您可以将值保存在一个地方,这在大多数情况下是足够的.

  • 这引发了一个例外“com 未定义”..至少对于我来说 (2认同)

Kev*_*sox 10

我建议Enum在实体上创建一个枚举字段.

public enum UserModelStatus{
     ACTIVE, INACTIVE
}

public UserModel{

    /* Other fields ommitted */

    @Enumerated(EnumType.STRING)
    private UserModelStatus status;

    /* Get/Set Method */
}
Run Code Online (Sandbox Code Playgroud)

然后创建您的存储库方法:

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

    public List<UserModel> findByStatus(UserModelStatus status);

}
Run Code Online (Sandbox Code Playgroud)

使用Spring Data你甚至不需要编写JPQL就像调用方法一样:

   @Autowired
   UserModelRepository userModelRepository;

   public void someMethod(){
       List<UserModel> userModels = userModelRepository.findByStatus(UserModelStatus.ACTIVE);
   }
Run Code Online (Sandbox Code Playgroud)


zde*_*sam 7

使用方法如下:

在存储库界面中,定义一个常量,如下所示:

public static final String USER_QUERY = "SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE;
Run Code Online (Sandbox Code Playgroud)

现在你可以使用了

@Query(value=USER_QUERY)
Run Code Online (Sandbox Code Playgroud)


WeG*_*eGa 6

我已经设法通过 SpEL T() 运算符在查询中使用类 String 常量,这使您可以访问给定类上的静态方法和常量。对于字符串,我必须用单引号 (') 包装表达式,您可能也需要它(如果发生 QuerySyntaxException)。

尝试这样的事情,

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

注意:如果您使用 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