Как создать постоянное числовое значение выражения в QueryDSL? - PullRequest
1 голос
/ 05 октября 2011

Я бы хотел создать такой запрос с помощью 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());

но я бы хотел знать, как это сделать первым способом.

// * РЕДАКТИРОВАТЬ 1014 *

Второй способ не работает:

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)

работает. Но я думаю, что есть ошибка.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Некоторое время назад мы удалили типы констант DSL из Querydsl. Если вы действительно хотите написать это первым способом, то вы должны выразить это так:

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 голос
/ 11 декабря 2013

У меня была такая же проблема некоторое время назад (нужна была константа 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 (на самом деле только для нуля и единицы).

...