我不想硬编码常量值,我宁愿通过引用变量指定它们。
例如,而不是编写下一个查询:
@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
有没有办法像弹簧数据查询中的第二个例子那样指定常量?
答案 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;
}