Spring Data Jpa SpEL是否可以在@Query注解中注入常量?

wf82jlnq  于 11个月前  发布在  Spring
关注(0)|答案(1)|浏览(202)

SpEL Spring Exp,我知道我们可以只使用连接运算符+,这样常量就可以被计算。

@Query(value = "UPDATE kdo set is_revise=0, update_by="
  + Constant.CREATOR+ ", update_time= CURRENT_TIMESTAMP where kdo.id=:kdoId", nativeQuery = true)
int flagRevised(String kdoId);

字符串
但我很好奇,它可以使用Spring表达式语言完成。不知何故已经演示了here。但在我的情况下,我想使用常量,我的方法只需要1个参数。

pu3pd22g

pu3pd22g1#

答案很简单:许多SpEL表达式不支持nativeQuery

如果放弃nativeQuery而使用JPQL,则可以在查询中添加SpEL表达式而不是常量,如下所示:

..., update_by=:#{T(x.y.z.Constant).CREATOR}, ...
OR
..., update_by=?#{T(x.y.z.Constant).CREATOR}, ...

  • (实际的SpEL表达式绑定由?#或:#触发。)*

如果你不能给予nativeQuery,但使用(或可以使用)Spring Data JPA晚于3.0.0,你可以使用QueryRewriter

查询重写器:
有时候,无论你尝试应用多少特性,似乎都不可能让Spring Data JPA在将查询发送到AlternityManager之前将你想要的所有东西应用到查询中。
有了3.0.0-SNAPSHOT(并针对Spring Data的下一个里程碑发布系列),您现在可以在将其发送到AlternityManager之前获得查询并“重写”它。也就是说,您可以在最后一刻进行任何更改。
我们可以让查询通过SpelExpressionParser,这样QueryRewriter就可以识别SpEL语句。(不同的问题可能需要TemplateParserContext或更多的代码改进。)
让我们创建SpELQueryRewriter类:

public class SpELQueryRewriter implements QueryRewriter {

    @Override
    public String rewrite(String query, Sort sort) {
        ExpressionParser expressionParser = new SpelExpressionParser();
        TemplateParserContext templateParserContext = new TemplateParserContext();
        Expression expression = expressionParser
                .parseExpression(query, templateParserContext);
        return (String) expression.getValue();
    }
}

字符串
让我们为Constant.CREATOR常量添加SpEL表达式和qqq类:

@Query(value = "UPDATE kdo "
                + "SET is_revise=0, "
                    + "update_by='#{T(x.y.z.Constant).CREATOR}', "
                    + "update_time= CURRENT_TIMESTAMP "
                + "WHERE kdo.id=:kdoId",
        nativeQuery = true,
        queryRewriter = SpELQueryRewriter.class)
int flagRevised(String kdoId);


您的查询将如下所示:

UPDATE kdo SET is_revise=0, update_by='CREATOR', update_time= CURRENT_TIMESTAMP WHERE kdo.id=:kdoId

相关问题