Squeryl:使用自定义函数和列名引用时出错

时间:2013-04-27 21:46:45

标签: scala squeryl

我正在使用Squeryl和自定义函数来进行地理空间查找,并且生成的SQL不正确。我拉着我的头发想弄清楚我做错了什么。这是我所拥有的一个超级简化示例:

我为正弦方程创建了以下自定义函数:

class SIN(e: NumericalExpression[Double], m:OutMapper[Double])
    extends FunctionNode[Double]("sin", Some(m), Seq(e)) with NumericalExpression[Double]

def sin(e: NumericalExpression[Double])(implicit m:OutMapper[Double]) = new SIN(e,m)   

然后我写了一个看起来像这样的查询(显然为了这个测试而简化了):

val query = from(StoreTable)(s =>
    select(s)
    orderBy(sin(s.latitude * Math.PI / 180))
)

产生以下SQL

Select ...
From
  store store14
Order By
  sin(store14.latitude)

订单中“Math.PI / 180”部分发生了什么变化?在进一步挖掘后,我发现了&函数来评估数据库端的表达式,这在这种情况下是有意义的,但使用&表达式实际上导致NullPointerException。这是我具体做的事情:

val query = from(this.table)(s =>
    select(s)
    orderBy(sin(&(s.latitude * Math.PI / 180.0)))
)

这导致以下异常:

[error]     NullPointerException: null (QueryDsl.scala:159)
[error] org.squeryl.internals.FieldReferenceLinker$.pushExpressionOrCollectValue(FieldReferenceLinker.scala:36)
[error] org.squeryl.dsl.QueryDsl$class.$amp(QueryDsl.scala:159)
[error] org.squeryl.PrimitiveTypeMode$.$amp(PrimitiveTypeMode.scala:40)

谁能告诉我我做错了什么?

提前致谢! 乔

1 个答案:

答案 0 :(得分:2)

你试过这个:

val query = from(StoreTable)(s =>
    select(s)
    orderBy(sin((s.latitude times Math.PI) div 180))
)