[英]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.