Фильтр для списка чисел в пятне 3

Я наткнулся на условие, чтобы отфильтровать список чисел в slick-3. Вот моя сущность.

    case class Company(id:Long, name: String, companyTypeId: Option[List[Long]] = None)

    implicit def GetResultCompany(implicit e0: GR[Long], e1: GR[String], e2: GR[Option[List[Long]]]): GR[Company] = GR{
        prs => import prs._
          CompanyTest.tupled((<<[Long], <<[String],<<?[List[Long]]))
      }
    class CompanyTable(_tableTag: Tag) extends Table[Company](_tableTag, Some("base"), "Company") {
        def * = (id, name,companyTypeId) <> (CompanyTest.tupled, CompanyTest.unapply)
        def ? = (Rep.Some(id), Rep.Some(name), companyTypeId).shaped.<>({r=>import r._; _1.map(_=> CompanyTest.tupled((_1.get, _2.get _3)))}, (_:Any) =>  throw new Exception("Inserting into ? projection not supported."))
        val id: Rep[Long] = column[Long]("CompanyId", O.AutoInc, O.PrimaryKey)
        val name: Rep[String] = column[String]("Name", O.Length(250,varying=true))
        val companyTypeId: Rep[Option[List[Long]]] = column[Option[List[Long]]]("CompanyTypeId", O.Length(19,varying=false), O.Default(None))
      }
    lazy val companyTable = new TableQuery(tag => new CompanyTable(tag))

Здесь я хочу найти companyTypeId, а это Option[List[Long]]

Я попытался выполнить companyTable.filter(_.companyTypeId === Some(List(1,2))), но получил Vector(), и в таблице есть строка данных с companyTypeId как {1}. Я использую базу данных Postgres.

Заранее спасибо.


person Jet    schedule 12.06.2015    source источник
comment
Как объект выглядит в базе данных? Вы действительно храните список значений в одном столбце?   -  person Gregor Raýman    schedule 12.06.2015
comment
@Грегор Райман ... да, это похоже на {1,2,3}, а тип данных - bigint[]   -  person Jet    schedule 12.06.2015
comment
Интересно. Я предполагаю, что нормализация другой связанной таблицы для вас не вариант. Я не уверен, как встроена поддержка столбцов Slick for Array, но это thread может оказаться полезным.   -  person Gregor Raýman    schedule 12.06.2015
comment
@Грегор Райман ... Я не должен нормализовать его по другой таблице. В любом случае спасибо за предложение.   -  person Jet    schedule 12.06.2015
comment
@ Gregor Raýman .... Я не нашел способа сделать это :-( Поэтому выбираю связанную таблицу.   -  person Jet    schedule 17.06.2015


Ответы (1)


Может быть, вы можете попробовать это так:

companyTable.filter(_.companyTypeId inSet(Traversable(List(1,2)))) 
// the above query filters rows with values in the given list
person Bhavya Latha Bandaru    schedule 14.06.2015
comment
@bhavya..... я получаю ошибку несоответствия типа, как и ожидалось: Traversable[List[Long]], факт: Traversable[Long] - person Jet; 15.06.2015
comment
@bhavya ... это то же самое, что и в вопросе. Если в базе данных есть идентификаторы {1,2}, и я даю поиск, например, companyTable.filter(.companyTypeId inSet(Traversable(List(1,2))))) получит результат. Но в случае, если я отправлю companyTable.filter(.companyTypeId inSet(Traversable(List(1))))), результат не будет получен. - person Jet; 15.06.2015
comment
@Jet .. это не работает только для однозначного списка ?? как List(1) .. List(2)... или даже во всех других случаях? - person Bhavya Latha Bandaru; 15.06.2015
comment
@bhavya ... Это даст результат, только если я дам значения, как в БД, в остальных случаях не получится - person Jet; 15.06.2015
comment
@Jet Да, я понимаю. Я никогда не работал над Postgres, можете ли вы просто вставить мне запрос, написанный в конце БД для этого случая, чтобы я мог предложить, можем ли мы построить запрос, используя любой из гладких методов? - person Bhavya Latha Bandaru; 16.06.2015
comment
@Bhavya... я пытался в Postgres найти результат для своего вопроса, но не получил: -(. Выберите * из base.CompanyTest, где CompanyTypeId = '{1}' не дает никакого результата, хотя база данных получила значения {1,2}. Но я могу получить результат для Select * из base.CompanyTest, где CompanyTypeId = '{1,2}'. - person Jet; 17.06.2015
comment
@Jet .. о, так что, может быть, теперь вы должны найти какой-то другой способ хранения и извлечения значений для этого сценария. - person Bhavya Latha Bandaru; 17.06.2015