Юрий Буянов «squeryl — orm с человеческим лицом»
TRANSCRIPT
![Page 1: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/1.jpg)
SQUERYLORM ! "#$%&#"#!'() $(*%)
!"#$ %&'()* e-Legion Ltd., 20111
![Page 2: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/2.jpg)
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
![Page 3: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/3.jpg)
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
![Page 4: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/4.jpg)
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
![Page 5: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/5.jpg)
SQUERYL
ORM
SQL-+%,%-./0 DSL ,$1 23+4%!%&
564%731 6(+(23*(1
8#.9:# '%,3, -%$9:# ,#$3
5
![Page 6: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/6.jpg)
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
![Page 7: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/7.jpg)
SQUERYL
val olderThan20s = people.where(_.age gt 20)
7
![Page 8: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/8.jpg)
SQUERYL
val olderThan20s =
from (people) ( p => select (p)where (p.age gt 20)
)
8
![Page 9: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/9.jpg)
!"#!$%
9
![Page 10: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/10.jpg)
!"#!$%
;.(*(3$(23*(1
<43.23'*((
5=#)3
Insert
Select
Update
Delete
10
![Page 11: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/11.jpg)
&#&'&()&*('&+
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
![Page 12: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/12.jpg)
,-(#*(.'&&
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
![Page 13: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/13.jpg)
"/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 +%$#0C%$1 )%7@6 -/69 var ($( val8%B.% @'32369 432)#4, ()1 !6%$-*3 & -32#>3!$#,%&369 KeyedEntity .# %-1236#$9.%
13
![Page 14: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/14.jpg)
"/01((CustomTypeMode)
5$%B./# '$3!!/ ,$1 +%$#0 8%7@6 &'$A"369 & !#-1 &3$(,3*(A, etc
14
![Page 15: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/15.jpg)
"/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.("#.(15&12(
15
![Page 16: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/16.jpg)
INSERT
import MySchema._ val vasya = users.insert(new User("[email protected]", "Vasya"))
users.insert(List(user1, user2))
16
![Page 17: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/17.jpg)
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
![Page 18: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/18.jpg)
FULL UPDATE
//используем copy//поскольку все поля immutable
val updatedVasya = vasya.copy(rating = vasya.rating + 1)
users.update(updatedVasya)
18
![Page 19: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/19.jpg)
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
![Page 20: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/20.jpg)
DELETE
users.delete(1)
val deleted = users.deleteWhere( u => u.rating.~ < 0 )
println("%s users deleted" format deleted)
20
![Page 21: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/21.jpg)
2$&3(01"+ 2()450
21
![Page 22: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/22.jpg)
2$&3(01"+ 2()450
5%!63&./# 23+4%!/
Group By ( 374#73*(1
Joins
Relations
22
![Page 23: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/23.jpg)
COMPOSITE SELECT
val rated = users.where( _.rating.~ >= 0)
val vasyasRated = from(rated) ( u => select(u) where(u.name like “%Vasya%”) )
23
![Page 24: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/24.jpg)
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
![Page 25: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/25.jpg)
067 SELECT
C%!643.(".31 &/-%4'3
from(users) ( u => ... ).page(offset, pageLength)
Distinct
from(users) ( u => ... ).distinct
ForUpdate
from(users) ( u => ... ).forUpdate
25
![Page 26: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/26.jpg)
(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
![Page 27: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/27.jpg)
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
![Page 28: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/28.jpg)
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
![Page 29: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/29.jpg)
(STATELESS) RELATIONS
case class User (....) extends KeyedEntity[Long] { //OneToMany[Post] < Querylazy val posts = MySchema.userPosts.left(this)
}
case class User (....) extends KeyedEntity[Long] { //ManyToOne[User] < Querylazy val user = MySchema.userPosts.right(this)
}
val user = users.lookup(1).getOrElse(error(“user not found”))
for (p <- user.posts) println(p.title)
29
![Page 30: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/30.jpg)
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
![Page 31: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/31.jpg)
#02!",(,.&
31
![Page 32: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/32.jpg)
#02!",(,.&
Compile-time VoodoocreateEqualityExpressionWithLastAccessedFieldReferenceAndConstant
>#6 UNION
5$(:'%) @)./0 DSLwhere ( u.name === stringOpt.? ) //работает
where ( u.flag === boolOpt.? ) //не работает
not(not(u.flag)).inhibitWhen(boolOpt != Some(true)) andnot(u.flag).inhibitWhen(boolOpt != Some(false))
32
![Page 33: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/33.jpg)
$!8-!"%?
33
![Page 34: Юрий Буянов «Squeryl — ORM с человеческим лицом»](https://reader034.vdocuments.net/reader034/viewer/2022052321/554b739fb4c905030a8b5516/html5/thumbnails/34.jpg)
"8("&9!
email: [email protected]
email: [email protected]
www: http://digal.github.com/
twitter: @digal
34