Я импортировал в Intellij проект Play / Scala с следующим вызовом метода , который получает ошибку компиляции по неясной причине.
Что такое причина этой ошибки компиляции?
Разве компилятор не может выбрать правильный перегруженный метод?
Я использую Java 8, Scala 2.11.7, Play 2.4.3, JOOQ 3.7.1, SBT 0.13.18.
def receive = {
case UserRegistered(phoneNumber, userName, timestamp) =>
database.withTransaction { sql =>
sql.insertInto(TWITTER_USER)
.columns(TWITTER_USER.CREATED_ON, TWITTER_USER.PHONE_NUMBER, TWITTER_USER.TWITTER_USER_NAME)
//THE FOLLOWING METHOD CALL HAS A COMPILATION ERROR:
.values(new Timestamp(timestamp.getMillis), phoneNumber, userName)
.execute()
}
case ClientEvent(phoneNumber, userName, MentionsSubscribed(timestamp), _) =>
database.withTransaction { sql =>
sql.insertInto(MENTION_SUBSCRIPTIONS)
.columns(MENTION_SUBSCRIPTIONS.USER_ID, MENTION_SUBSCRIPTIONS.CREATED_ON)
.select(
select(TWITTER_USER.ID, value(new Timestamp(timestamp.getMillis)))
.from(TWITTER_USER)
.where(
TWITTER_USER.PHONE_NUMBER.equal(phoneNumber)
.and(
TWITTER_USER.TWITTER_USER_NAME.equal(userName)
)
)
).execute()
}
case ClientEvent(phoneNumber, userName, MentionReceived(id, created_on, from, text, timestamp), _) =>
database.withTransaction { sql =>
sql.insertInto(MENTIONS)
.columns(
MENTIONS.USER_ID,
MENTIONS.CREATED_ON,
MENTIONS.TWEET_ID,
MENTIONS.AUTHOR_USER_NAME,
MENTIONS.TEXT
)
.select(
select(
TWITTER_USER.ID,
value(new Timestamp(timestamp.getMillis)),
value(id),
value(from),
value(text)
)
.from(TWITTER_USER)
.where(
TWITTER_USER.PHONE_NUMBER.equal(phoneNumber)
.and(
TWITTER_USER.TWITTER_USER_NAME.equal(userName)
)
)
).execute()
}
}
Как видите, вызов метода .values(new Timestamp(timestamp.getMillis), phoneNumber, userName)
имеет ошибку компиляции. Вывод ошибки:
[info] Compiling 30 Scala sources and 1 Java source to /home/me/projects/book/CH07/target/scala-2.11/classes...
[error] /home/me/projects/book/CH07/app/actors/CQRSEventHandler.scala:21: overloaded method value values with alternatives:
[error] (x$1: org.jooq.Field[java.time.OffsetDateTime],x$2: org.jooq.Field[String],x$3: org.jooq.Field[String])org.jooq.InsertValuesStep3[generated.tables.records.TwitterUserRecord,java.time.OffsetDateTime,String,String] <and>
[error] (x$1: java.time.OffsetDateTime,x$2: String,x$3: String)org.jooq.InsertValuesStep3[generated.tables.records.TwitterUserRecord,java.time.OffsetDateTime,String,String]
[error] cannot be applied to (java.sql.Timestamp, String, String)
[error] .values(new Timestamp(timestamp.getMillis), phoneNumber, userName)
[error] ^
[error] /home/me/projects/book/CH07/app/actors/CQRSEventHandler.scala:31: type mismatch;
[error] found : org.jooq.SelectConditionStep[org.jooq.Record2[Long,java.sql.Timestamp]]
[error] required: org.jooq.Select[_ <: org.jooq.Record2[Long,java.time.OffsetDateTime]]
[error] .where(
[error] ^
[error] /home/me/projects/book/CH07/app/actors/CQRSEventHandler.scala:58: type mismatch;
[error] found : org.jooq.SelectConditionStep[org.jooq.Record5[Long,java.sql.Timestamp,String,String,String]]
[error] required: org.jooq.Select[_ <: org.jooq.Record5[Long,java.time.OffsetDateTime,String,String,String]]
[error] .where(
[error] ^
[error] /home/me/projects/book/CH07/app/actors/CQRSQueryHandler.scala:29: overloaded method value greaterOrEqual with alternatives:
[error] (x$1: org.jooq.QuantifiedSelect[_ <: org.jooq.Record1[java.time.OffsetDateTime]])org.jooq.Condition <and>
[error] (x$1: org.jooq.Select[_ <: org.jooq.Record1[java.time.OffsetDateTime]])org.jooq.Condition <and>
[error] (x$1: org.jooq.Field[java.time.OffsetDateTime])org.jooq.Condition <and>
[error] (x$1: java.time.OffsetDateTime)org.jooq.Condition
[error] cannot be applied to (org.jooq.Field[java.sql.Timestamp])
[error] MENTIONS.CREATED_ON.greaterOrEqual(currentDate().cast(PostgresDataType.TIMESTAMP))
[error] ^
[error] four errors found
[error] (compile:compileIncremental) Compilation failed
[error] application -
! @7fjed5mfe - Internal server error, for (GET) [/] ->
play.sbt.PlayExceptions$CompilationException: Compilation error[Overloaded method value [values] cannot be applied to (java.sql.Timestamp, String, String)]
at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27) ~[na:na]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.7.jar:na]
at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49) ~[na:na]
at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44) ~[na:na]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.7.jar:na]
at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44) ~[na:na]
at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40) ~[na:na]
at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) ~[na:na]
at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17) ~[na:na]
Перегруженные методы в org.jooq.InsertValuesStep3 (3.7.1)
:
<code>package org.jooq;
import java.util.Collection;
import javax.annotation.Generated;
/**
* This type is used for the {@link Insert}'s DSL API.
* <p>
* Example: <code><pre>
* using(configuration)
* .insertInto(table, field1, field2, field3)
* .values(field1, field2, field3)
* .values(field1, field2, field3)
* .onDuplicateKeyUpdate()
* .set(field1, value1)
* .set(field2, value2)
* .execute();
*
* * @author Lukas Eder * / @Generated ("Этот класс был создан с помощью jOOQ- инструменты ") publi c интерфейс InsertValuesStep3 extends InsertOnDuplicateStep {/ ** * Добавить значения в оператор вставки. * / @Support InsertValuesStep3 значения (значение T1, значение T2, значение T3); / ** * Добавить значения в оператор вставки. * / @Support InsertValuesStep3 Значения (поле значение1, поле значение2, поле значение3); / ** * Добавить значения в оператор вставки. * / @Support InsertValuesStep3 значения (Collection ценности); / ** * Использование оператора
SELECT
в качестве источника значений для оператора *
INSERT
*
* Этот вариант оператора INSERT .. SELECT
предполагает выбор *, возвращающий ровно столько полей, сколько указано ранее в * INTO
предложение: * {@link DSLContext # insertInto (Таблица, Поле, Поле, Поле)} * / @Support InsertOnDuplicateStep select (Выбрать > выберите); }