42

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

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

@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 查询中的第二个示例中那样指定常量?

4

7 回答 7

41

您必须像这样使用完全限定的类名:

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

但它的坏处是 IDE 不会将其识别为 UserModel 类的用法。唯一的好处是您可以将值保存在一个地方,这在大多数情况下就足够了。这已在IntelliJ IDEA 2017.1中解决。我不知道其他IDE。

于 2014-03-04T11:04:16.803 回答
13

我建议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);
   }
于 2013-08-23T12:41:34.867 回答
12

使用如下:

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

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

现在你可以使用

@Query(value=USER_QUERY)
于 2015-08-14T02:40:35.163 回答
7

我已经设法通过 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

于 2017-10-10T08:41:10.507 回答
2

对于标准解决方案,这个问题的答案似乎是“否”。

一些 JPA 实现可能有自己的解决方案,但休眠似乎并不支持此处其他答案所建议的任何方法。

于 2015-05-14T22:41:53.527 回答
-1

当您想直接在 @Query 注释中使用常量时,您可以编写如下内容:

@Query("SELECT u FROM UserModel u WHERE u.status = " + UserModel.STATUS_ACTIVE)
于 2013-08-23T15:31:59.243 回答
-1

是的,这是一种更优雅的方式,它也具有可读性。例如:

@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;
}
于 2021-03-01T13:15:39.733 回答