2013-04-27 67 views
0

我正在使用Squeryl和自定义函数来执行地理空间查找,并且生成的SQL不正确。我正在拉我的头发,试图弄清楚我做错了什么。这里是什么,我有一个超级简单的例子:Squeryl:使用自定义函数和列名引用的错误

我创建了下面的自定义函数为正弦关系:

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) 

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

在此先感谢! 乔

回答

2

你有没有尝试过这样的:

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

+0

运营商'时代'和'div'在这种情况下提升AST – 2013-05-03 17:04:48

+0

您好最高。是的,这是有效的。非常感谢! – Joe 2013-05-03 20:17:42

相关问题