Liftweb - 带有映射器的SQL表字段的最大值

时间:2012-02-06 18:08:49

标签: sql scala lift mapper

我想找一个简单的方法来访问liftweb中Mapped元素的最大值,这是我实际做的一个例子:

映射器部分

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包含等于string中包含的最大值的inttargetRaw

如果您有任何建议或任何问题,我将很乐意为您提供帮助。

2 个答案:

答案 0 :(得分:3)

我不相信lift-mapper有一种运行此查询的内置方式。事实上,它在任何类型的聚合函数上都很短。我所看到的只是some count methods

The find* methods仅适用于返回Mapper类型的对象,正如您可以通过返回类型看到的那样。

鉴于目前在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
    

答案 1 :(得分:0)

这是我最终使用的解决方案:

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