2011-10-05 36 views
1

我想創建這樣的查詢與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-? 

括號只是dissapeared 。難道我做錯了什麼?它看起來像這樣:

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

具有相同的結果。

針對上述問題

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

作品。但我認爲有一個錯誤。

+0

您可以在GitHub上打開它的票:https://github.com/mysema/querydsl/issues –

+0

QueryDSL工作正常。這是一個Hibernate的bug。更新WorkMessage workMessage set workMessage.earnedPrice = - (workMessage.totalCost - :a1)轉換爲更新work_message set earn_price = -total_cost-? –

+0

對不起,我誤解了 –

回答

2

前段時間我們從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

+0

謝謝蒂莫。你可以看看/ /編輯上面的部分? –

+0

什麼原因沒有固定的數字表達式?我真的需要一個NumberExpression 現在值爲零。 –

+0

原因是不必要的API複雜性和維護開銷。 NumberTemplate.ZERO應該爲你工作。 –

0

我有同樣的問題的一些(需要常量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); 
    } 
} 

當然,這可能(僅適用於零和一個實際)做了一下比較通用,使用類型參數,但我們確實需要它只是爲整數。

+0

在這種情況下,您可以使用com.mysema.query.types.Constant或ConstantImpl –