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());

しかし、最初の方法でそれを行う方法を知りたいです。

//編集

2番目の方法は機能しません:

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 (実際には 0 と 1 のみ) だけでした。

于 2013-12-11T17:28:32.440 に答える