34
SQUERYL ORM ! "#$%&#"#!’() $(*%) !"#$ %&’()* e-Legion Ltd., 2011 1

Юрий Буянов «Squeryl — ORM с человеческим лицом»

Embed Size (px)

Citation preview

Page 1: Юрий Буянов «Squeryl — ORM с человеческим лицом»

SQUERYLORM ! "#$%&#"#!'() $(*%)

!"#$ %&'()* e-Legion Ltd., 20111

Page 2: Юрий Буянов «Squeryl — ORM с человеческим лицом»

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 с человеческим лицом»

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 с человеческим лицом»

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 с человеческим лицом»

SQUERYL

ORM

SQL-+%,%-./0 DSL ,$1 23+4%!%&

564%731 6(+(23*(1

8#.9:# '%,3, -%$9:# ,#$3

5

Page 6: Юрий Буянов «Squeryl — ORM с человеческим лицом»

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 с человеческим лицом»

SQUERYL

val olderThan20s = people.where(_.age gt 20)

7

Page 8: Юрий Буянов «Squeryl — ORM с человеческим лицом»

SQUERYL

val olderThan20s =

from (people) ( p => select (p)where (p.age gt 20)

)

8

Page 9: Юрий Буянов «Squeryl — ORM с человеческим лицом»

!"#!$%

9

Page 10: Юрий Буянов «Squeryl — ORM с человеческим лицом»

!"#!$%

;.(*(3$(23*(1

<43.23'*((

5=#)3

Insert

Select

Update

Delete

10

Page 11: Юрий Буянов «Squeryl — ORM с человеческим лицом»

&#&'&()&*('&+

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 с человеческим лицом»

,-(#*(.'&&

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 с человеческим лицом»

"/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 с человеческим лицом»

"/01((CustomTypeMode)

5$%B./# '$3!!/ ,$1 +%$#0 8%7@6 &'$A"369 & !#-1 &3$(,3*(A, etc

14

Page 15: Юрий Буянов «Squeryl — ORM с человеческим лицом»

"/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 с человеческим лицом»

INSERT

import MySchema._ val vasya = users.insert(new User("[email protected]", "Vasya"))

users.insert(List(user1, user2))

16

Page 17: Юрий Буянов «Squeryl — ORM с человеческим лицом»

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 с человеческим лицом»

FULL UPDATE

//используем copy//поскольку все поля immutable

val updatedVasya = vasya.copy(rating = vasya.rating + 1)

users.update(updatedVasya)

18

Page 19: Юрий Буянов «Squeryl — ORM с человеческим лицом»

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 с человеческим лицом»

DELETE

users.delete(1)

val deleted = users.deleteWhere( u => u.rating.~ < 0 )

println("%s users deleted" format deleted)

20

Page 21: Юрий Буянов «Squeryl — ORM с человеческим лицом»

2$&3(01"+ 2()450

21

Page 22: Юрий Буянов «Squeryl — ORM с человеческим лицом»

2$&3(01"+ 2()450

5%!63&./# 23+4%!/

Group By ( 374#73*(1

Joins

Relations

22

Page 23: Юрий Буянов «Squeryl — ORM с человеческим лицом»

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 с человеческим лицом»

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 с человеческим лицом»

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 с человеческим лицом»

(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 с человеческим лицом»

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 с человеческим лицом»

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 с человеческим лицом»

(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 с человеческим лицом»

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 с человеческим лицом»

#02!",(,.&

31

Page 32: Юрий Буянов «Squeryl — ORM с человеческим лицом»

#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 с человеческим лицом»

$!8-!"%?

33