relate
relate copied to clipboard
TupleParameter ignores how paramters insert placeholders.
For example:
Given:
case class CustomTypeParameter(str: String, sqlType: String) extends SingleParameter {
override protected def set(statement: PreparedStatement, i: Int): Unit =
statement.setString(i, str)
override def appendPlaceholders(stringBuilder: StringBuilder) = {
super.appendPlaceholders(stringBuilder)
val _ = stringBuilder.append(s"::$sqlType")
}
}
This code:
class TupleParameter(val params: Iterable[SingleParameter]) extends MultipleParameter {
def appendPlaceholders(stringBuilder: StringBuilder) = {
val length = params.size
if(length > 0) {
stringBuilder.append("?")
var i = 1
while (i < length) {
stringBuilder.append(",?")
i += 1
}
}
}
}
produces ?, instead of ?::someSqlType.
This can be improved by
case class BetterTupleParameter(params: Iterable[SingleParameter]) extends MultipleParameter {
def appendPlaceholders(stringBuilder: StringBuilder) = {
var first = true
params.foreach { param =>
if (!first) stringBuilder.append(',')
param.appendPlaceholders(stringBuilder)
first = false
}
}
}
object BetterTupleParameter {
implicit def fromIterable[A](
it: Iterable[A]
)(implicit ev: A => SingleParameter): BetterTupleParameter =
apply(it.map(ev))
}