3

次の問題で行き詰まりました。

次のようなPostというクラスがあります。

case class Post (

  id: Int,
  slug: String,
  title: String,

  @Column("postText")
  text: String,
  isVisible: Boolean,
  created: Timestamp,
  lastUpdated: Timestamp,
  published: Option[Timestamp]

) extends KeyedEntity[Int]

私の問題は、投稿が公開されたフィールドで並べ替えられているときに、データベースから前の投稿と次の投稿を取得すること です。私が立ち往生している問題は、公開されたフィールドが Option[Timestamp] であることです。次のような Squeryl クエリを作成しました。

val nextPost = from(postTable)( p =>
      where((p.published > post.published) and p.isVisible === true)
      select(p)
      orderBy(p.published asc)
    ).page(0, 1)

結果のSQLを見ると、「... WHERE post.published > Some("....") ...」のようなものがあり、もちろんこれはSQLクエリで構文エラーを引き起こしました。

ドキュメントを調べましたが、答えが見つかりません。すでにSlickへの乗り換えを考えています...

アップデート

squeryl mysql クエリの構築には明確なバグがあります。私はで終わった

val x : Timestamp =  post.published.getOrElse(new Timestamp(0))
val nextPost = from(postTable)( p =>
  where((p.published.getOrElse(new Timestamp(0)) > x) and p.isVisible === true)
    select(p)
    orderBy(p.published asc)
).page(0, 1)

クエリを生成します:

Select
  Post9.lastUpdated as Post9_lastUpdated,
  Post9.published as Post9_published,
  Post9.postText as Post9_postText,
  Post9.slug as Post9_slug,
  Post9.id as Post9_id,
  Post9.isVisible as Post9_isVisible,
  Post9.title as Post9_title,
  Post9.created as Post9_created
From
  Post Post9
Where
  ((Post9.published > 2013-08-01 14:21:25.0) and (Post9.isVisible = true))
Order By
  Post9.published Asc
limit 1 offset 0

クエリコンストラクターが日付をどのようにフォーマットしたかを見てください...

SLICKに乗り換えました。

4

2 に答える 2

1

これは、DB オブジェクトではなくタイムスタンプを比較したためだと思います。Squeryl を使用するには、違いを理解することが重要です。

したがって、代わりに次を使用する必要があります。

p.published gte post.published
p.published.~ > post.published
p.published === post.published
p.published gt post.published

参照:

http://squeryl.org/schema-definition.html

http://squeryl.org/inserts-updates-delete.html

実際には、「少ない」/「多い」が必要なすべての例です。

于 2013-08-14T08:31:36.200 に答える