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

时间:2011-10-05 13:08:14

标签: java jpa-2.0 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));

但这不起作用 - Expression没有减法方法。

我是这样做的:

        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-?

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

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

有相同的结果。

对于上述问题

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

的工作原理。但我认为有一个错误。

2 个答案:

答案 0 :(得分:3)

我们前一段时间从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

答案 1 :(得分: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(实际上只用于零和一)。