Mais conteúdo relacionado Semelhante a Юрий Буянов «Squeryl — ORM с человеческим лицом» (20) Юрий Буянов «Squeryl — ORM с человеческим лицом»1. SQUERYL
ORM ! "#$%&#"#!'() $(*%)
!"#$ %&'()* e-Legion Ltd., 2011
1
2. ORM
Query q = entityManager.createQuery(
"SELECT AVG(g.scoreInPercentage) FROM Grades g where g.subjectId = :subjectId"
);
q.setParameter(1, mathId);
Number avg = (Number) q.getSingleResult();
avg.floatValue();
2
3. ORM
Query q = entityManager.createQuery(
"SELECT AVG(g.scoreInPercentage) FROM Grades g where g.subjectId = :subjectId"
);
q.setParameter(1, mathId);
Number avg = (Number) q.getSingleResult();
avg.floatValue();
3
4. TYPE SAFE ORM (JPA 2)
EntityManager em = ...
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
c.where(condition);
TypedQuery<Person> q = em.createQuery(c);
List<Person> olderThan20s = q.getResultList();
4
6. TYPE SAFE ORM (JPA 2)
EntityManager em = ...
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
c.where(condition);
TypedQuery<Person> q = em.createQuery(c);
List<Person> olderThan20s = q.getResultList();
6
11. &#&'&()&*('&+
import org.squeryl.SessionFactory
import java.sql.DriverManager._
Class.forName("org.h2.Driver")
SessionFactory.concreteFactory = Some { ()=>
Session.create(
getConnection("jdbc:h2:mem:"),
new H2Adapter
)
}
“>3(&.31” ?3-4('3
;!+%$92@06# ConnectionPool (DBCP, BoneCP)
11
12. ,-(#*(.'&&
transaction { ... }
&!#7,3 .3"(.3#6 .%&@A 643.23'*(A ( '%))(6(6
& '%.*#
inTransaction { ... }
.("#7% .# ,#$3#6, #!$( (!+%$92@#6!1 &.@64(
,4@7%0 643.23'*((
12
13. "/01(
(PrimitiveTypeMode)
case class User(
id: Long = 0,
@Column(length = 256)
email: String,
name: String,
rating: Int = 0,
) extends KeyedEntity[Long]
Plain Old Scala Object ()%B.% case)
563.,346./# 6(+/ ,$1 +%$#0
C%$1 )%7@6 -/69 var ($( val
8%B.% @'32369 432)#4, ()1 !6%$-*3 & -32#
>3!$#,%&369 KeyedEntity .# %-1236#$9.%
13
14. "/01(
(CustomTypeMode)
5$%B./# '$3!!/ ,$1 +%$#0
8%7@6 &'$A"369 & !#-1 &3$(,3*(A, etc
14
15. "/01(
object MySchema extends Schema {
val users = table[User]
on(users) { u => declare(
u.id is (autoIncremented),
u.email is (unique)
)
}
}
transaction { MySchema.create }
<3-$(*/
D743.("#.(1
5&12(
15
17. SELECT
from(users) ( u =>
select(u)
where(u.name like “%Vasya%”)
)
from(users) ( u =>
select(u.id, u.email)
orderBy(u.id asc)
)
users.where( _.rating.~ >= 0)
//Option[User]
users.lookup(1)
17
19. PARTIAL UPDATE
val updated =
update(users) ( u =>
set(u.rating := u.rating.~ + 1)
where(u.name like "%Vasya%")
)
println("%s Vasyas rated" format updated)
~. "6%-/ .# +@6369 Int.+ ( SQL ‘+’
&)#!6% ~. )%B.% (!+%$92%&369 u.rating plus 1
19
23. COMPOSITE SELECT
val rated =
users.where( _.rating.~ >= 0)
val vasyasRated =
from(rated) ( u =>
select(u)
where(u.name like “%Vasya%”)
)
23
24. NESTED SELECT
val rated =
users.where( _.rating.~ >= 0)
val vasyasRated =
from(rated) ( u =>
select(u)
where(u.id in
from(rated)
(r => select(r.id))
)
)
24
25. 067 SELECT
C%!643.(".31 &/-%4'3
from(users) ( u => ... ).page(offset, pageLength)
Distinct
from(users) ( u => ... ).distinct
ForUpdate
from(users) ( u => ... ).forUpdate
25
26. (3-03('&+
val ratingDistribution =
from(users) ( u =>
groupBy(u.rating)
compute(count(u.id))
)
ratingDistribution foreach { r=>
println(“%s: %s” format (r.key, r.measures))
}
26
27. JOIN
from(users, posts) ( (u,p) =>
select(u.name, p)
where(u.id === p.userId)
)
from(users, avatars.leftOuter) ( (u,a) =>
select(u, a.url)
on(u.id === a.map(_.userId))
)
27
28. RELATIONS
object MySchema extends Schema {
val users = table[User]
val posts = table[Post]
val userPosts =
oneToManyRelation(users, posts) via ( (u,p) =>
u.id === p.userId
)
}
28
29. (STATELESS) RELATIONS
case class User (....) extends KeyedEntity[Long] {
//OneToMany[Post] < Query
lazy val posts = MySchema.userPosts.left(this)
}
case class User (....) extends KeyedEntity[Long] {
//ManyToOne[User] < Query
lazy val user = MySchema.userPosts.right(this)
}
val user =
users.lookup(1).getOrElse(error(“user not found”))
for (p <- user.posts)
println(p.title)
29
30. STATEFUL RELATIONS
case class User (....) extends KeyedEntity[Long] {
//StatefulOneToMany[Post] < Iterable[Post]
lazy val posts = MySchema.userPosts.leftStateful(this)
}
case User (....) extends KeyedEntity[Long] {
//StetefulManyToOne[User]
lazy val user = MySchema.userPosts.rightStateful(this)
}
30
32. #02!",(,.&
Compile-time Voodoo
createEqualityExpressionWithLastAccessedFieldReferenceAndConstant
>#6 UNION
5$(:'%) @)./0 DSL
where ( u.name === stringOpt.? ) //работает
where ( u.flag === boolOpt.? ) //не работает
not(not(u.flag)).inhibitWhen(boolOpt != Some(true))
and
not(u.flag).inhibitWhen(boolOpt != Some(false))
32