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

时间:2013-08-23 12:32:50

标签: java spring jpql spring-data

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

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

@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

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

7 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分:9)

我建议在实体上创建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);
   }

答案 2 :(得分:6)

使用如下:

在存储库界面中,按如下方式定义常量:

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

现在你可以使用

@Query(value=USER_QUERY)

答案 3 :(得分:2)

我通过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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

@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;
}