在本机 spring @Query 中使用应用程序属性

Use application properties in native spring @Query

我有一个存储库,其中包含一个执行本机查询以从数据库获取数据的方法:

public interface ObjRepository extends CrudRepository<Obj, Long> {
    @Query(value = "SELECT obj.*\n" +
            "FROM obj\n" +
            "WHERE obj.value < #{${property.name}} and obj.value2 < :arg", nativeQuery = true)
    public List<Obj> getObjs(@Param("arg") int arg);

我正在尝试使用 属性 作为查询中的常量。 属性 在 application.properties 文件中定义为 property.name=300。当我尝试 运行 查询时,出现异常:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "{"

如果我将 #{${property.name}} 替换为字符串中的实际数字,则查询工作正常。我的 SpEL 语法错误吗?如何在查询字符串中使用 application.properties 中定义的 属性?

基于

任意表达式是不是implemented/supported

请查看关于 Using SpEL expressions

的 Spring 数据 JPA 文档

As of Spring Data JPA release 1.4 we support the usage of restricted SpEL template expressions in manually defined queries via @Query

Spring Data JPA supports a variable called entityName.

其他灵魂

There was a similar question. And you can try something from its answer.

改变你的ObjRepository

public interface ObjRepository extends CrudRepository<Obj, Long> {
    @Query(value = "SELECT obj.*\n" +
                "FROM obj\n" +
                "WHERE obj.value < :value and obj.value2 < :arg", nativeQuery = true)
    public List<Obj> getObjs(@Param("arg") int arg, @Param("value") int value);

然后就可以这样使用了

@Service
public class SomeService {

    @Value("${property.name}")
    private int value;

    @Autowired
    private ObjRepository objRepository ;

    public List<Obj> getObjs(int arg) {
        return objRepository.getObjs(arg, value);
    }
}