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