【问题标题】:Use application properties in native spring @Query在原生 spring @Query 中使用应用程序属性
【发布时间】:2019-12-29 21:25:17
【问题描述】:

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

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 中定义的属性?

【问题讨论】:

  • 试试'${property.name}'#{'${property.name}'}

标签: java spring spring-data spring-el


【解决方案1】:

基于this answer:

任意表达式不实施/不支持

请查看有关Using SpEL expressions的 Spring Data JPA 文档

从 Spring Data JPA 1.4 版开始,我们支持在通过 @Query 手动定义的查询中使用受限 SpEL 模板表达式

Spring Data JPA 支持一个名为 entityName 的变量。

其他灵魂

There was a similar question。你可以试试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);
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2019-04-15
    • 1970-01-01
    • 2018-03-23
    • 2019-01-05
    相关资源
    最近更新 更多