2014-11-12 7 views
1

Я пытаюсь использовать возможности QueryDSL, выполняя некоторые операции, пока я все еще создаю Список определенных DTO с информацией, поступающей из моей базы данных, делая это, я могу избежать беспорядочных операций после этого. В приведенном ниже примере это глупо представление о том, что я пытаюсь достичь:Математические операции со значениями объектов (VO) с использованием QueryDSL

public class Product { 
    private Quantity total; 

    //more code here 
} 

public class Quantity { 
    //code here 
    public Quantity multiply(Quantity quantity) { 
     return Quantity.of(this.value.multiply(quantity.numberValue()); 
    } 
    //more code here 
} 



public static Function<JPQLQuery, List<MyDTO>> someMethod() { 
    return q -> { 

     //some code here 

     q.from(...) 

     //more code here 

     .list(new QMyDTO(qProduct.total.multiply(qProduct.total).sum())); 
    }; 
} 

Проблема заключается в том, что QueryDSL использует NumberExpression обеспечить некоторые операции, такие как сумма, умножение и т.д., что хорошо работает с типами как BigDecimal, но не работает с пользовательскими типами, такими как мой объект значения Quantity. Я пытался что-то придумать, но у меня не было никакого успеха, и я не нашел ничего подобного.

Есть ли что-либо, что могло бы помочь мне в достижении этого?

ответ

1

Вы можете создать метод делегата для этого случая

@QueryDelegate(Quantity.class) 
public static Expression<Quantity> multiply(QQuantity quantity, Quantity other){ 
    return Expressions.operation(Quantity.class, 
     Ops.MULTI, quantity, ConstantImpl.create(other)); 
} 

После этого вы сможете Express

qProduct.total.multiply(qProduct.total) 
+0

Спасибо вам еще раз. Я попробовал делегата раньше, но без части «Выражения». Это сделало трюк –