在本机 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);
}
}
我有一个存储库,其中包含一个执行本机查询以从数据库获取数据的方法:
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);
}
}