我遇到了以下问题。
我有一个班级,比如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时,我看到类似这样的东西:“......在哪里post.published>一些(”......“)......”当然这导致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。
答案 0 :(得分: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
实际上所有需要“少”/“更大”的例子。
答案 1 :(得分:0)
我没有验证这一点,但你试过吗
p.published.get > post.published.get
这可以帮助你摆脱Some(...)
部分。
注意:您的查询可能会有不同的行为,因为在SQL" NULL == NULL"不是真的(它是NULL ......)。您也可以尝试getOrElse(...)
。