繁体   English   中英

如何在QueryDSL中创建常量数值表达式?

[英]How to create constant numeric value expression in QueryDSL?

我想用QueryDSL创建这样的查询

update WorkMessage w set w.totalPrice = 0.12 - w.totalCost;

我试过这样的

    Expression<Float> priceExpr = Expressions.constant(0.12f);

    new JPAUpdateClause(em, w)
            .set(w.totalPrice , priceExpr.subtract(w.totalCost));

但这不起作用 - 表达式没有减法方法。

我是这样做的:

        new JPAUpdateClause(em, w)
            .set(w.totalPrice , w.totalCost.subtract(0.12f).negate());

但我想先知道如何做到这一点。

//编辑

第二种方式不起作用:

JPAUpdateClause.toString说:

update WorkMessage workMessage 
set workMessage.totalPrice = -(workMessage.totalCost - :a1)

但SQL结果是

update work_message set total_price=-total_cost-?

圆括号消失了。 难道我做错了什么? 它看起来像是:

w.totalCost.subtract(0.12f).negate()
w.totalCost.negate().subtract(0.12f)

有相同的结果。

对于上述问题

w.totalCost.negate().add(0.12f)

作品。 但我认为有一个错误。

我们前一段时间从Querydsl删除了DSL Constant类型。 如果你真的想以第一种方式编写它,那么你必须像这样表达它:

Expressions.operation(Float.class, Ops.SUB, 
    Expressions.constant(0.12f), w.totalCost)

要么

NumberOperation.create(Float.class, Ops.SUB, 
    Expressions.constant(0.12f), w.totalCost)

如果你需要NumberExpression

我前段时间遇到了同样的问题(需要常量0),并且构建了我自己的ConstantNumberExpression类。 结果非常简单:-)

一个同事刚才有同样的问题,对于常数1,所以我决定在这里发布。

private static class ConstantNumberExpression extends NumberExpression<Integer> {
    private static final long serialVersionUID = 1220768215234001828L;

    public ConstantNumberExpression(final int constant) {
        super(new ConstantImpl<>(constant));
    }

    @Override
    @Nullable
    public <R, C> R accept(final Visitor<R, C> v, @Nullable final C context) {
        return v.visit((Constant<Integer>) mixin, context);
    }
}

当然,使用类型参数可以做得更通用,但我们确实只需要Integer(实际上只用于零和一)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM