我正在使用Querydsl JPA(4.1.4)查询多个字段,它是一个基于我生成查询的参数的动态API。
当我选择metric为field.avg()时,它返回Double,当我选择field.count()时,它返回Long,这很好,但是当我的表达式有两个Longs的除法时,它返回一个Long值,甚至虽然DB返回的值是一个浮点值。
有没有办法告诉Querydsl应该将值检索为double?我已经尝试使用.doubleValue()
和.castToNum(Double.class)
但是在MySQL上它会返回一个无效的强制转换异常。
示例代码:
NumberExpression metric = field1.countDistinct().divide(field2.countDistinct());
List<Tuple> tuples = query.select(key, metric)...;
tuples.forEach(tuple -> tuple.get(1, Number.class));
我也尝试了这个没有成功,它仍然返回Long:
Expressions.numberTemplate(Double.class, "{0} / {1}", field1.countDistinct(), field2.countDistinct());
解:
field1.countDistinct().doubleValue().divide(field2.countDistinct())
抛出
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'double precision) as col_2_0_...
但使用floatValue工作
field1.countDistinct().floatValue().divide(field2.countDistinct())