我想用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)
的工作原理。但我认为有一个错误。
答案 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(实际上只用于零和一)。