3

我想找到一种简单的方法来访问 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包含 astringint等于targetRaw

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

4

2 回答 2

3

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

这些find*方法仅适用于返回Mappers 类型的对象,从它们的返回类型可以看出。

鉴于目前在 Lift 中没有很好的方法可以做到这一点,您有多种选择可供选择。

  1. 使用lift-squeryl-record而不是 lift-mapper。Squeryl 是一个比较完整的 ORM,并且支持分组和聚合函数

  2. 创建您自己的特征,将max函数添加到MetaMapper. 这将是一些工作,但您可以使用实现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
    
于 2012-02-14T20:40:21.340 回答
0

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

val max = DB.runQuery("SELECT YEAR(MAX(targetRaw)) FROM targetTable")._2.head.head.toInt
于 2012-02-15T17:48:08.653 回答