2012-02-06 48 views
3

一個SQL表字段的最大值,我想找到一個簡單的方法來訪問liftweb映射的元素的最大值,這裏是什麼,我實際上做一個例子:Liftweb - 與映射

映射部分

class MappedEntity extends LongKeyedMapper[MappedEntity] with IdPK { 
    def getSingleton = MappedEntity 
    object targetRaw extends MappedInt(this) 
} 

object MappedEntity extends MappedEntity with LongKeyedMetaMapper[MappedEntity] 

搜索部分

val max = MappedEntity.findAllByInsecureSql(
    "SELECT MAX (targetRaw) AS targetRaw FROM MappedEntity", 
    IHaveValidatedThisSQL("chris", "2011,11,14") 
).head.targetRaw.get 

當假設我的工作一個名爲MappedEntity SQL表,我想max到包含一個stringint等於包含在targetRaw

如果您有任何建議或我會很樂意幫助任何問題的最大值。

回答

3

我不認爲lift-mapper具有運行此查詢的內置方式。事實上,它在任何聚合函數上都很短。我看到的全部是some count methods

The find* methods僅適用於返回Mapper s類型的對象,正如您可以通過它們的返回類型所看到的那樣。

鑑於在Lift中沒有很好的方法來完成此操作,因此您可以選擇多個選項。

  1. 使用lift-squeryl-record代替lift-mapper。 Squeryl是一個更完整的ORM,並且支持group and aggregate functions

  2. 創建屬於您自己的特徵,它將max函數添加到MetaMapper。這將是一個工作,但您可以使用the implementation of count作爲指導。

    • 從技術上講,可能會有更通用的實現來處理所有聚合函數(max,min,sum,count,...)。這可能是我們在業務中稱之爲「過度殺傷」的原因。
  3. 只寫一些SQL。 Lift提供了一種獲取與數據庫連接的貸款模式方式。它還具有貸款模式助手,用於準備語句和執行查詢,當您完成所有操作時,所有內容都會自動關閉。

    DB.use(DefaultConnectionIdentifier) { conn => 
        // execute query 
    } 
    
  4. 找到具有您要查找的值的對象,然後檢索該字段。這具有醜陋,緩慢和脆弱的明顯缺點。

    val max: Option[String] = MappedEntity.findAll(
        BySql("targetRaw IN (SELECT MAX (targetRaw) FROM MappedEntity)", 
        IHaveValidatedThisSQL("chris", "2011,11,14")).map(_.targetRaw.is).headOption 
    
+0

感謝您的非常完整的答案,我想我將探討解決方案3. – 2012-02-14 20:56:01

+0

這當然是最簡單的! – leedm777 2012-02-14 22:49:01

+0

您可以提供解決方案3中使用的請求,它會使您的答案完整和完美。 – 2012-02-15 17:13:04

0

這是我最後使用的解決方案:

val max = DB.runQuery("SELECT YEAR(MAX(targetRaw)) FROM targetTable")._2.head.head.toInt