1

我想用 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)

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

4

2 回答 2

3

不久前,我们从 Querydsl 中删除了 DSL 常量类型。如果你真的想用第一种方式来写,那么你必须这样表达:

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

于 2011-10-05T13:29:28.840 回答
1

前段时间我遇到了同样的问题(需要常量 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(实际上只用于零和一)。

于 2013-12-11T17:28:32.440 回答