有没有办法在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 

有没有办法像spring-data查询中的第二个例子那样指定常量?

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

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

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

我建议在实体上创建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{ public List findByStatus(UserModelStatus status); } 

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

  @Autowired UserModelRepository userModelRepository; public void someMethod(){ List 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) 

如果要在@Query注释中直接使用常量,可以编写如下内容:

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

对于标准解决方案,答案似乎是“否”。

一些JPA实现可能有他们自己的解决方案但是hibernate似乎并不支持并且似乎不支持其他答案所提出的任何方法。

我已经设法通过SpEL T()运算符在查询中使用类String常量,这使您可以访问给定类的静态方法和常量。 对于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