JPQL

JPQL エンティティとエンティティのコレクション

SQL 行と列のテーブル構造

SELECT b

FROM Book b

WHERE b.title = 'xxx' AND b.price = yyy

SELECT DISTINCT b

FROM Book b

WHERE b.title = ?1 AND b.price = ?2 位置指定パラメータ

WHERE b.title = :title AND b.price = :price 名前付き指定パラメータ

SELECT

CASE b.editor

WHEN "xxx"

THEN b.price * 0.5

ELSE b.price * 0.8

END

FROM Book b

SELECT c.address

FROM Customer c

ORDER BY c.age DESC, c.address.country ASC

SELECT NEW com.xxx.MyCustomerDTO(c.aaa, c.bbb)

FROM Customer c

SELECT c

FROM Customer c

WHERE c.age = (SELECT MIN(c2.age) FROM Customer c2)

SELECT c.address.country, COUNT(c)

FROM Customer c

GROUP BY c.address.country

HAVING c.address.country <> 'xxx'

DELETE FROM Customer c

WHERE c.age < 20

UPDATE Customer c

SET c.name = 'xxx'

WHERE c.age < 20

※AND, OR

※=, >, <, <=, >=, <>, (NOT) BETWEEN, (NOT) LIKE, (NOT) IN, IS (NOT) NULL, IS (NOT) EMPTY, NOT (MEMBER) OF

※集計:AVG, COUNT, MAX, MIN, SUMなど

※数値:ABS, SORT, MOD, SIZE, INDEX

※文字列:CONCAT, SUBSTRING, TRIM, LOWER, UPPER, LENGTH, LOCATE

※日時:CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP

副問い合わせ

SELECT emp

FROM Employee emp

WHERE emp.salary > [ALL, ANY, SOME] (

SELECT m.salary

FROM Manager m

WHERE m.department = emp.department

)

ALL すべてに合致

ANY,SOME 一つ以上に合致

SELECT DISTINCT emp

FROM Employee emp

WHERE [NOT] EXISTS (

...

)

SELECT c

FROM Customer c

WHERE

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

結合

SELECT o

FROM Order o

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

JOIN l.product p

Inner Join

Implicit

SELECT employee.id, phone.id

FROM Employee employee, employee.phones phone

Explicit

SELECT employee.id, phone.id

FROM Employee employee JOIN employee.phones phone

Left Outer Join

SELECT DISTINCT employee.id

FROM Employee employee LEFT JOIN employee.phones phone

※トランザクション境界外の問題を解決するため、LAZYフェッチ⇒EAGERフェッチ

※FETCHの目的: Avoid lazy fetching / force eager fetching

SELECT c FROM class c WHERE id = :id class.getStudents() Lazy

SELECT c FROM class c JOIN FETCH c.students class.getStudents() Eager

★Literals

SELECT e FROM Employee e WHERE e.name = 'Andy' String

SELECT e FROM Employee e WHERE e.id = 1234 Integer

SELECT e FROM Employee e WHERE e.id = 1234L Long

SELECT s FROM Stat s WHERE s.ratio > 3.14F Float

SELECT s FROM Stat s WHERE s.ratio > 3.14e32D Double

SELECT e FROM Employee e WHERE e.active = TRUE Boolean

UPDATE Employee e SET e.manager = NULL WHERE e.manager = :manager NULL

-- Date {d'yyyy-mm-dd'}

SELECT e FROM Employee e WHERE e.startDate = {d'2014-04-11'}

-- Time {t'hh:mm:ss'}

SELECT e FROM Employee e WHERE e.startTime = {t'09:00:00'}

-- Timestamp {ts'yyy-mm-dd hh:mm:ss.nnnnnnnnn'}

SELECT e FROM Employee e WHERE e.version = {ts'2014-04-11 09:00:00.000000001'}

-- Enum package.class.enum

SELECT e FROM Employee e WHERE e.gender = xxx.Gender.MALE

★Add/Substract a time period to a date

public List<Item> getRecentItems(int numberOfDays) {

// JDK approach

Calendar calendar = new GregorianCalendar();

calendar.setTimeZone(TimeZone.getTimeZone("UTC+9"));

calendar.setTime(new Date());

calendar.add(Calendar.DATE, -numberOfDays);

Date dateToLookBack = calendar.getTime();

// Joda-time approach

DateTime dateToLookBack = new DateTime(new Date());

dateToLookBack = dateToLookBack.minusDays(numberOfDays);

dateToLookBack.toDate();

String sqlString =

"SELECT i FROM Item i where i.insertionDate > :dateToLookBack";

TypedQuery<Item> query = entityManager.createQuery(sqlString, Item.class);

query.setParameter("dateToLookBack", dateToLookBack, TemporalType.DATE);

return query.getResultList();

}