2013-06-18 19 views
2

查詢我有一個返回查詢的方法:我怎麼能指望從squeryl

def list:Query[User] = from(users)(u => where(u.age>20) select(u)) 

現在我想算表,但這種方法:

list.count(_ => true) 

會得到和循環列表中的所有元素。

我想找到一個解決方案,使Query[User]「選擇計數」語句,但尚未找到。

還是我寫的另一種方法爲計數:

def countList: Long = from(users)(u => where(u.age>20) compute(count)) 

這是不是我想要的。

回答

2

嘗試創作了兩個查詢:

from(list)(_ => compute(count)) 
+0

它不能被編譯:'從性狀FromSignatures缺少方法參數; 按照此方法使用_如果您想將其視爲部分應用函數,請使用_ – Freewind

+1

您將查詢'Queryable'與'Table'相同,因此上述語法看起來更具說明性。可編譯代碼可能如下所示:'from(list)(l => compute(count))' – jcern

0

在這種情況下,它可能是有意義的做一個公共查詢生成器,這樣你就可以在一個地方保持狀態的邏輯。當您分頁查詢結果集時,它非常方便。

def queryBuilder[T](action: User => WhereState[Conditioned] => QueryYield[T]) : Query[T] = from(users)(u => action(u)(where(u.age>20))) 

def countQuery = queryBuilder(u => w => w.compute(count)) 

def selectQuery = queryBuilder(u => w => w.select(u)) 
0

這裏是DAO對象的示例:

def countByJobPostingId(jobPostingId: Int): Long = { 
    inTransaction { 
    val q = from(table)(t => 
     where(t.jobPostingId === jobPostingId) 
     compute count 
    ) 

    LOG.debug(q.statement) 

    q.head.measures 
    } 
}