Liftweb - Максимальное значение поля таблицы SQL с маппером - PullRequest
3 голосов
/ 06 февраля 2012

Я хотел бы найти простой способ доступа к максимальному значению элемента Mapped в liftweb, вот пример того, что я на самом деле делаю:

Часть Mapper

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

Предполагая, что я работаю с таблицей SQL с именем MappedEntity, я хочу, чтобы max содержал либо string, либо int равно максимальному значению, содержащемуся в targetRaw

Если у вас есть какие-либо предложения или вопросы, я буду рад помочь.

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

Я не верю, что у lift-mapper есть встроенный способ выполнения этого запроса.На самом деле, это очень мало для любого вида агрегатных функций.Я вижу только некоторые count методы .

Методы find* подходят только для возврата объектов типа Mapper, как вы можетесм. по типам возвращаемых данных.

Учитывая, что в Lift не существует замечательного способа сделать это в его нынешнем виде, у вас есть несколько вариантов на выбор.

  1. Использование lift-squeryl-record вместо лифт-картографа.Squeryl является более полным ORM и поддерживает групповые и агрегатные функции .

  2. Создайте свою собственную черту, которая добавляет max функции к MetaMapper.Это было бы немного работы, но вы можете использовать реализацию count в качестве руководства.

    • Технически, может быть более общая реализация, которая обрабатывает всеагрегатные функции (max, min, sum, count, ...).Это может быть то, что мы в бизнесе называем «излишним».
  3. Просто напишите немного SQL.Лифт предлагает способ получения соединения с базой данных.У него также есть помощники шаблона ссуды для подготовки операторов и выполнения запросов таким образом, чтобы все было автоматически закрыто, когда вы закончите с ним.

    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
    
0 голосов
/ 15 февраля 2012

Вот решение, которое я наконец-то использовал:

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