2015-03-17 1 views
0

Я новичок в SLICK (2.1) и теряюсь при создании моего первого запроса с использованием union. Поскольку в конечном итоге параметры предоставляются из внешнего (через веб-интерфейс), я устанавливаю их как необязательные. См. Комментарий в коде ниже. Как создать соответствующий запрос?SLICK: простой запрос с использованием списков объединения и параметров

Мой фактический класс более сложный, который я упростил ради этого вопроса.

case class MyStuff(id: Int, value: Int, text: String) 

class MyTable (tag: Tag) extends Table[MyStuff](tag, "MYSTUFF"){ 

    def id = column[Int]("ID", O NotNull) 
    def value = column[Int]("VALUE", O NotNull) 
    def text = column[String]("TEXT", O NotNull) 

    def * = 
    (id, 
    value, 
    text).shaped <> ((MyStuff.apply _).tupled, MyStuff.unapply) 
} 

object myTable extends TableQuery(new MyTable(_)){ 
    def getStuff(ids: Option[List[Int]], values: Option[List[Int]])(implicit session: Session): Option[List[MyStuff]] = { 
    /* 
    1) If 'ids' are given, retrieve all matching entries, if any. 
    2) If 'values' are given, retrieve all matching entries (if any), union with the results of the previous step, and remove duplicate entries. 
    4) If neither 'ids' nor 'values' are given, retrieve all entries. 
    */ 
    } 
} 

getStuff называется так:

db: Database withSession { implicit session => val myStuff = myTable.getStuff(...) }

+0

O NotNull не следует писать явно. Это значение по умолчанию в Slick. – cvogt

ответ

1

Вы можете использовать вставку, если значения Some, иначе литеральные ложные и только фильтры, если что-то не является None.

if(ids.isDefined || values.isDefined) 
    myTable.filter(row => 
     ids.map(row.id inSet _).getOrElse(slick.lifted.LiteralColumn(false)) 
    ) union myTable.filter(row => 
     values.map(row.value inSet _).getOrElse(slick.lifted.LiteralColumn(false)) 
    ) 
    else myTable 
0

Если я вас правильно понял вы хотите создать фильтр во время выполнения с данного входа. Вы можете просмотреть расширенные документы для версии 3.0 (http://slick.typesafe.com/doc/3.0.0-RC1/queries.html#sorting-and-filtering) по «критериям построения с использованием« динамического фильтра », например, из веб-формы». Эта часть документов также действительна для версии 2.1.

+0

Из связанной документации я понимаю, что мой запрос должен выглядеть примерно так: def getStuff (ids: Option [List [Int]], values: Option [List [Int]]) = myTable.filter {myTable => Список ( ids.map (myTable.id === _), values.map (myTable.value === _) ) .distinct } Что терпит неудачу с различными ошибками (аргументами выведенного типа, несоответствием типов, Тип T не может быть условием запроса). – jans

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