我正在使用带有自定义函数的 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)
谁能告诉我我做错了什么?
提前致谢!乔