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いずれかを含める必要があります。stringinttargetRaw

ご提案やご質問がございましたら、お気軽にお問い合わせください。

4

2 に答える 2

3

lift-mapperにこのクエリを実行する方法が組み込まれているとは思いません。実際、あらゆる種類の集計関数では非常に短いです。私が見るのはいくつかのcount方法だけです。

find*メソッドは、Mapper戻り型からわかるように、s型のオブジェクトを返す場合にのみ適しています。

現状ではLiftでこれを行うための優れた方法がないことを考えると、いくつかのオプションから選択できます。

  1. lift-mapperの代わりにlift-squeryl-recordを使用してください。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 に答える