2013-08-05 3 views
3

У меня возникла следующая проблема.Squeryl: как сравнить опцию [T] объектов в where where?

У меня есть класс, скажем, пост, который выглядит как:

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] 

Моя проблема заключается, чтобы получить предыдущие и последующие сообщения из базы данных, когда посты в заказанные опубликовано поле. Проблема, с которой я столкнулся, заключается в том, что опубликованное поле - опция [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> Некоторые из них (" .... ") .. . " и, конечно, это привело к синтаксической ошибке в SQL-запросе.

Я просмотрел документацию, но не могу найти ответ. Я уже думал о переходе на Slick ...

UPDATE

Существует определенная ошибка в squeryl тузда построении запросов. Я закончил с

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

Какая версия Squeryl была такой? –

+0

Я посмотрел на свою конфигурацию sbt, это было 0.9.5-6 –

+0

Я понимаю, что если вы переехали и у вас нет времени, но мне бы хотелось увидеть воспроизводимый тестовый пример, чтобы мы могли вместе исправить если это ошибка. Вы можете опубликовать его здесь или (предпочтительно) в списке Squeryl https://groups.google.com/forum/#!forum/squeryl. –

ответ

0

Я не проверял это, но вы пробовали

p.published.get > post.published.get 

Это должно помочь вам избавиться от Some(...) части.

Внимание: ваш запрос может вести себя по-разному, потому что в SQL «NULL == NULL» неверно (это NULL ...). Вы также можете попробовать getOrElse(...).

1

Я думаю, это потому, что вы сравнивали Timestamps, а не объекты DB. Очень важно понять разницу в использовании squeryl.

Таким образом, вы должны использовать вместо:

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

Refs:

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

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

и на самом деле все примеры, где "меньше"/"больше" необходимы.

Смежные вопросы