簡體   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