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