我想找一个简单的方法来访问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
中包含的最大值的int
或targetRaw
如果您有任何建议或任何问题,我将很乐意为您提供帮助。
答案 0 :(得分:3)
我不相信lift-mapper有一种运行此查询的内置方式。事实上,它在任何类型的聚合函数上都很短。我所看到的只是some count
methods。
The find*
methods仅适用于返回Mapper
类型的对象,正如您可以通过返回类型看到的那样。
鉴于目前在Lift中没有很好的方法可以做到这一点,你有几种选择可供选择。
使用lift-squeryl-record代替lift-mapper。 Squeryl是一个更完整的ORM,支持group and aggregate functions。
创建自己的特征,将max
个函数添加到MetaMapper
。这可能会有一些工作,但您可以使用the implementation of count
作为指南。
只需编写一些SQL。 Lift提供了一种获取与数据库连接的贷款模式方式。它还有贷款模式帮助程序,用于准备语句和执行查询,因为当你完成它时,一切都会自动关闭。
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
答案 1 :(得分:0)
这是我最终使用的解决方案:
val max = DB.runQuery("SELECT YEAR(MAX(targetRaw)) FROM targetTable")._2.head.head.toInt