我想找到一种简单的方法来访问 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
包含一个 string
或一个 int
,等于targetRaw
如果您有任何建议或任何问题,我将很乐意为您提供帮助。
最佳答案
我不相信 lift-mapper 有运行此查询的内置方式。事实上,它对任何类型的聚合函数都非常缺乏。我看到的都是some count
methods .
The find*
methods仅适合返回 Mapper
类型的对象,正如您可以通过它们的返回类型看到的那样。
鉴于目前的 Lift 中没有很好的方法来做到这一点,您有多种选择可供选择。
使用lift-squeryl-record而不是电梯映射器。 Squeryl是一个更完整的ORM,并且支持group and aggregate functions .
创建您自己的特征,将
max
函数添加到MetaMapper
。这需要一些工作,但您可以使用 the implementation ofcount
作为指导。- 从技术上讲,可能有一个更通用的实现来处理所有聚合函数(最大值、最小值、总和、计数……)。这可能就是我们业内所说的“矫枉过正”。
只需编写一些 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
关于sql - Liftweb - 使用映射器获取 SQL 表字段的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164945/