我定义了一个对象来帮助将结果集转换为 POJO。
// an object, that help to map from query result to POJO,
object Dummy extends SQLSyntaxSupport[Dummy] {
override val tableName = "dummy"
def apply(rs: WrappedResultSet) = new Dummy(
rs.long("id"), rs.stringOpt("name"), rs.intOpt("size"), rs.jodaDateTime("create_date"))
}
然后下面的代码尝试从表中查询,
/*** query - with condition - start ***/
// use paste mode (:paste) on the Scala REPL
val d = Dummy.syntax("d")
val name = "hello"
val helloDummyOpt: Option[Dummy] = withSQL {
select.from(Dummy as d).where.eq(d.name, name).limit(1)
}.map(rs => Dummy(rs)).single.apply()
printf("hello dummy:\t%s\n", if(helloDummyOpt.isDefined) helloDummyOpt.get else "")
/*** query - with condition - end ***/
从控制台,我可以看到生成的 sql 是:
select d.id as i_on_d, d.name as n_on_d, d.size as s_on_d, d.create_date as cd_on_d
from dummy d where d.name = 'hello' limit 1;
为了使转换工作,需要更改生成的 sql 中的列别名以保持表中的原始名称,例如,name
而不是n_on_d
.
那么,如何做到这一点,谢谢。
@更新
完整的代码在这里:
package eric.scalikejdbc
import scalikejdbc._
import org.postgresql.Driver._
import org.joda.time._
/**
* scalikejdbc hello.
* @author eric
* @date Jul 6, 2016 23:14:07 PM
*/
object ScalikeJdbcHello extends App {
Class.forName("org.postgresql.Driver")
ConnectionPool.singleton("jdbc:postgresql://localhost:5432/sportslight", "postgres", "123456")
implicit val session = AutoSession
/*** query - parse as List of Map - start ***/
// find rows, with limit 10000,
val entities: List[Map[String, Any]] = sql"select * from dummy limit 10000".map(_.toMap).list.apply()
printf("dummy count: %d\n", entities.size)
/*** query - parse as List of Map - end ***/
/*** query - parse as POJO - start ***/
// define a POJO class,
case class Dummy(id: Long, name: Option[String], size: Option[Int], createDate: DateTime)
// an object, that help to map from query result to POJO,
object Dummy extends SQLSyntaxSupport[Dummy] {
override val tableName = "dummy"
def apply(rs: WrappedResultSet) = new Dummy(
rs.long("id"), rs.stringOpt("name"), rs.intOpt("size"), rs.jodaDateTime("create_date"))
}
// find top 10 rows,
val dummyList: List[Dummy] = sql"select * from dummy limit 10".map(rs => Dummy(rs)).list.apply()
var i = 0;
printf("dummy top rows:\n")
for (d <- dummyList) {
printf("\t[%d] %s\n", i, d)
i = i + 1
}
/*** query - parse as POJO - end ***/
/*** query - with condition - start ***/
// TODO ... specify column name in result,
val d = Dummy.syntax("d")
val name = "hello"
val helloDummyOpt: Option[Dummy] = withSQL {
select.from(Dummy as d).where.eq(d.name, name).limit(1)
}.map(rs => Dummy(rs)).single.apply()
printf("hello dummy:\t%s\n", if(helloDummyOpt.isDefined) helloDummyOpt.get else "")
/*** query - with condition - end ***/
}
这是创建表和初始化数据的sql postgresql
:
/* table - dummy */
-- drop table
drop table if exists dummy;
-- create table
create table dummy (
id serial8,
name varchar(50) not null,
size int not null,
create_date timestamptz,
primary key (id)
);
-- init data - dummy
insert into dummy(name, size, create_date) values
('test', 1, now()),
('hello', 1, now());