2012-07-01 24 views
1

我最近開始評估Squeryl ORM,它看起來不錯,但最後我來到了一個SQL查詢,這似乎是用Squeryl「構建」的問題。在Squeryl ORM中的WHERE子查詢中使用gt,gte等

我想獲得所有產品的數量都高於所有產品的平均數量。 在SQL中,這看起來像

SELECT * FROM product p WHERE p.quantity > (SELECT AVG(quantity) FROM product) 

我已經發現了Squeryl支持in(),在where -clause子查詢exists()notExists()。但由於Squeryl還支持avg聚集,我希望這樣的事情是可能的:

val avgQuantity = from(products)(p => compute(avg(p.quantity))) 
val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity) select(p)) 

可悲的是,這引起了:

type mismatch; found : org.squeryl.Query[org.squeryl.dsl.Measures[Option[org.squeryl.PrimitiveTypeMode.FloatType]]] 
required: org.squeryl.dsl.NumericalExpression[?] 

當然,我能夠做的是,在2查詢(首先,獲取平均數量,然後在第二個查詢中使用它),但我想知道是否可以使用來完成一個查詢,其中包括子查詢

Squeryl這是不可能的,還是我只是失去了一些東西?

如果可能或不可以,我會很感激任何幫助,如果,如何。

感謝,

塞巴斯蒂安

回答

1

每一樣討論的郵件列表,a fix was pushed到Squeryl主分支,將包含在下一版本中。

+0

請問您可以發佈一個簡短的片段,看看sebastian_oe給出的查詢是怎麼樣的? –

+2

嗨,我剛剛嘗試從項目的主分支修復,它的工作如期: 'val avgQuantity:org.squeryl.Query [org.squeryl.dsl.Measures [Option [Double]]] = from(products )(p => compute(avg(p.quantity)))'然後您可以在 中使用'val oftenOccuringProducts = from(products)(p => where(p.quantity gt avgQuantity)select(p))''。 正如預期的那樣,這會將查詢創建爲1個SQL語句。 (請注意,我將這個類型顯式添加到第1條語句中以使其更加清晰。) –