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

Liftweb-具有映射器的SQL表字段的最大值,sql,scala,lift,mapper,Sql,Scala,Lift,Mapper,我想找到一种简单的方法来访问liftweb中映射元素的最大值,下面是我实际操作的一个示例: 映射器零件 class MappedEntity extends LongKeyedMapper[MappedEntity] with IdPK { def getSingleton = MappedEntity object targetRaw extends MappedInt(this) } object MappedEntity extends MappedEntity with Lon

我想找到一种简单的方法来访问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
搜索部分

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
假设我使用名为mappedenty的SQL表,我希望
max
包含
string
int
等于
targetRaw
中包含的最大值


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

我不相信lift mapper有运行此查询的内置方式。事实上,它在任何类型的聚合函数上都非常短。我所看到的是

仅适用于返回
Mapper
s类型的对象,从返回类型可以看出

鉴于目前在电梯中并没有很好的方法来实现这一点,您可以选择几个选项

  • 使用而不是提升贴图器。Squeryl是一个更完整的ORM,支持

  • 创建您自己的特性,将
    max
    函数添加到
    MetaMapper
    。这将是一个小的工作,但你可以使用作为一个指南

    • 从技术上讲,可以有一个更通用的实现来处理所有聚合函数(max、min、sum、count等)。这可能就是我们在商界所说的“过度杀戮”
  • 只需编写一些SQL。Lift提供了一种获得数据库连接的贷款模式。它还有贷款模式帮助器,用于准备语句和执行查询,在这样一个was中,当您使用完它时,一切都会自动关闭

    DB.use(DefaultConnectionIdentifier) { conn =>
      // execute query
    }
    
  • 找到具有您要查找的值的对象,然后检索该字段。这有明显的缺点,丑陋、缓慢和脆弱

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

  • 以下是我最终使用的解决方案:

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

    谢谢你提供了非常完整的答案,我想我将探讨解决方案3。这当然是最简单的!请您提供解决方案3中使用的请求,它将使您的答案完整而完美。