исключение при расширении макроса: [ошибка] java .lang.IllegalStateException: недопустимая группа по агрегации: - PullRequest
0 голосов
/ 13 января 2020

У меня есть такая таблица в MYSQL.

create table Employee(
 id tinyint,
 name char(36),
 is_permanent tinyint,
 company_name char(36),
 designation Char(36),
 primary key (id)

);

, и я хочу написать запрос SELECT для этой таблицы с помощью Quill SQL.

 select count(1),  sum((case when (`designation` = 'software') then 1 else 0 end)) from employee group by company_name;

Я написал модель и

case class Employee(id: Int,
                    name: String,
                    is_permanent: Boolean,
                    company_name: String,
                    designation: Designation)

  trait Designation {
   val value: String
  }

  case object SoftwareEngineer extends Designation {
     override val value: String = "software"
  }

 case object MechanicalEngineer extends Designation {
   override val value: String = "mechanical"
  }

Мой запрос с использованием гусиного шва

ctx.run {
  query[Employee].groupBy(_.company_name).map {
    case (compName, employeeTable) =>
      (employeeTable.size,
       employeeTable.filter(_.designation == lift(SoftwareEngineer)).size,
       compName)
  }
}

, где ctx - это контекст пера.

Однако компилятор показывает ошибку, что

exception during macro expansion: 
 [error] java.lang.IllegalStateException: Invalid group by aggregation: 'x48.filter(x49 => 
 x49.designation == ?).size'

Правильно ли рассчитан отфильтрованный счет в выражении group by? Если нет, есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 14 января 2020

Способ определения условного счета для предложения group by НЕ

 employeeTable.filter(_.designation == lift(SoftwareEngineer)).size,

, а

 employeeTable.map { i =>
          if (i.`designation` == lift(SoftwareEngineer)) 1
          else 0
        }.sum

Конечно, с правильным кодером, определенным для designation

...