19
金魚本に載ってないJPQLの話 @megascus 12924日月曜日

金魚本に載ってないJpqlの話 #glassfishjp

Embed Size (px)

Citation preview

Page 1: 金魚本に載ってないJpqlの話 #glassfishjp

金魚本に載ってないJPQLの話@megascus

12年9月24日月曜日

Page 2: 金魚本に載ってないJpqlの話 #glassfishjp

金魚本のJPQLの記載

12年9月24日月曜日

Page 3: 金魚本に載ってないJpqlの話 #glassfishjp

15 / 557ページ

12年9月24日月曜日

Page 4: 金魚本に載ってないJpqlの話 #glassfishjp

金魚本に載っていないけど使えるJPQLの構文

12年9月24日月曜日

Page 5: 金魚本に載ってないJpqlの話 #glassfishjp

副問い合わせ

SELECT emp

FROM Employee emp  WHERE emp.salary > [ALL,ANY,SOME] (    SELECT m.salary    FROM Manager m  WHERE m.department = emp.department)

12年9月24日月曜日

Page 6: 金魚本に載ってないJpqlの話 #glassfishjp

副問い合わせ(EXISTS句)

SELECT DISTINCT empFROM Employee empWHERE [NOT] EXISTS ( SELECT spouseEmp FROM Employee spouseEmp WHERE spouseEmp = emp.spouse)

12年9月24日月曜日

Page 7: 金魚本に載ってないJpqlの話 #glassfishjp

相関副問い合わせ

SELECT cFROM Customer cWHERE (SELECT AVG(o.price) FROM c.orders o) > 100

12年9月24日月曜日

Page 8: 金魚本に載ってないJpqlの話 #glassfishjp

結合

SELECT oFROM Order AS o

[[LEFT] OUTER,INNER] JOIN o.lineItems l

JOIN l.product p

12年9月24日月曜日

Page 9: 金魚本に載ってないJpqlの話 #glassfishjp

FETCH JOIN

SELECT oFROM Order AS o

JOIN FETCH o.lineItems l

※Lazyフェッチになっている結合を

強制的にEagerフェッチにする

12年9月24日月曜日

Page 10: 金魚本に載ってないJpqlの話 #glassfishjp

こんなエラーを見たら使う

• Hibernate

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

• EclipseLink

org.eclipse.persistence.exceptions.ValidationExceptionException Description: An attempt was made to traverse a relationship using indirection that had a null Session. This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. To avoid this issue, instantiate the LAZY relationship prior to serialization.

12年9月24日月曜日

Page 11: 金魚本に載ってないJpqlの話 #glassfishjp

コンストラクタ式

SELECT NEW example.CustomerDetails(c.id, c.status, o.count) FROM Customer c JOIN c.orders o WHERE o.count > 100

12年9月24日月曜日

Page 12: 金魚本に載ってないJpqlの話 #glassfishjp

コンストラクタ式

•使いこなせればEager、Lazyの判断が要らなくなる。

(全部Eagerで性能の心配がある時コンストラクタ式で取得)

•サマリーを取得したい場合には使って下さい。

12年9月24日月曜日

Page 13: 金魚本に載ってないJpqlの話 #glassfishjp

JPQL使用上の注意

12年9月24日月曜日

Page 14: 金魚本に載ってないJpqlの話 #glassfishjp

JPQL使用上の注意

•すでにメモリ上に取得されたエンティティへの反映は行われない。

•@Versionの更新は自動では行われない。

12年9月24日月曜日

Page 15: 金魚本に載ってないJpqlの話 #glassfishjp

メモリ上のエンティティ

12年9月24日月曜日

Page 16: 金魚本に載ってないJpqlの話 #glassfishjp

@VERSIONの更新

UPDATE customer cSET c.status = ‘outstanding’ c.version = c.version + 1WHERE c.balance < 10000

※JPQLの場合楽観ロックは自分で制御して下さい。

12年9月24日月曜日

Page 17: 金魚本に載ってないJpqlの話 #glassfishjp

JPQLの予約語

ABS, ALL, AND, ANY, AS, ASC, AVG, BETWEEN, (BIT_LENGTH), BOTH, BY, CASE, (CHAR_LENGTH), (CHARACTER_LENGTH), CLASS, COALESCE, CONCAT, COUNT, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, DELETE, DESC, DISTINCT, ELSE, EMPTY, END, ENTRY, ESCAPE, EXISTS, FALSE, FETCH, FROM, GROUP, HAVING, IN, INDEX, INNER, IS, JOIN, KEY, LEADING, LEFT, LENGTH, LIKE, LOCATE, LOWER, MAX, MEMBER, MIN, MOD, NEW, NOT, NULL, NULLIF, OBJECT, OF, OR, ORDER, OUTER, (POSITION), SELECT, SET, SIZE, SOME, SQRT, SUBSTRING, SUM, THEN, TRAILING, TRIM, TRUE, TYPE, (UNKNOWN), UPDATE, UPPER, VALUE, WHEN, WHERE

※括弧でくくってあるものは将来に対する予約語

12年9月24日月曜日

Page 18: 金魚本に載ってないJpqlの話 #glassfishjp

JSR 317JavaTM Persistence

API Version 2.0今日の内容+α

全部書いてあります。

http://jcp.org/en/jsr/detail?id=317

12年9月24日月曜日

Page 19: 金魚本に載ってないJpqlの話 #glassfishjp

マスタリングJAVAEE5古くても

日本語情報が欲しい場合

http://goo.gl/C1QZQ

12年9月24日月曜日