2013-04-27 42 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

相關問題