public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("shop");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
//////////////////////////////////////////////////////////////////
List<Member> members = em.createQuery("SELECT m FROM Member m WHERE m.name like '%hello%'", Member.class)
.getResultList();
//////////////////////////////////////////////////////////////////
for (Member member : members) {
System.out.println("member = " + member);
}
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* SELECT
m
FROM
Member m
WHERE
m.name like '%hello%' */ select
m1_0.MEMBER_ID,
m1_0.city,
m1_0.street,
m1_0.zipcode,
m1_0.USERNAME,
m1_0.TEAM_ID,
m1_0.endDate,
m1_0.startDate
from
MEMBERS m1_0
where
m1_0.USERNAME like '%hello%' escape ''
query.setlect(m).where(...)
와 같이 프로그래밍 코드로 JPQL을 작성할 수 있다는 점이다.public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Member> query = cb.createQuery(Member.class);
Root<Member> m = query.from(Member.class);
CriteriaQuery<Member> member = query.select(m).where(cb.equal(m.get("name"), "kim"));
List<Member> resultList = em.createQuery(member).getResultList();
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* <criteria> */ select
m1_0.MEMBER_ID,
m1_0.city,
m1_0.street,
m1_0.zipcode,
m1_0.name,
m1_0.TEAM_ID,
m1_0.endDate,
m1_0.startDate
from
MEMBERS m1_0
where
m1_0.name=?
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
List resultList = em.createNativeQuery("select MEMBER_ID, city, street, zipcode, name from MEMBER", Member.class).getResultList();
for (Object object : resultList) {
System.out.println("object = " + object);
}
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* dynamic native SQL query */ select
MEMBER_ID,
city,
street,
zipcode,
name
from
MEMBER
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setName("멤버");
em.persist(member);
//////////////////////////////////////////////////////////////////
TypedQuery<Member> query1 = em.createQuery("select m from Member as m", Member.class);
TypedQuery<String> query2 = em.createQuery("select m.name from Member as m", String.class);
Query query = em.createQuery("select m.name, m.age from Member as m");
//////////////////////////////////////////////////////////////////
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
query.getResultList()
: 결과가 하나 이상일 때, 리스트 반환query.getSingleResult()
: 결과가 정확히 하나, 단일 객체 반환```java
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
Member member = new Member();
member.setUsername("Member");
member.setAge(10);
em.persist(member);
////////////////////////////////////////////////////////////////
Member singleResult = em.createQuery("select m from Member as m where m.username = :username", Member.class)
.setParameter("username", "Member")
.getSingleResult();
////////////////////////////////////////////////////////////////
System.out.println("singleResult = " + singleResult);
et.commit();
} catch (Exception e) {
et.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setName("멤버");
em.persist(member);
Member singleResult = em.createQuery("select m from Member as m where m.name = :name", Member.class)
.setParameter("name", "멤버")
.getSingleResult();
System.out.println("singleResult = " + singleResult.getName());
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
SELECT m FROM MEMBER m
→ 엔티티 프로젝션SELECT m.team FROM Member m
→ 엔티티 프로젝션SELECT m.address FROM Member m
→ 임베디드 타입 프로젝션SELECT m.name, m.age FROM Member m
→ 스칼라 타입 프로젝션List<Member> list = em.createQuery("select m from Member as m", Member.class).getResultList();
Member findMember = list.get(0);
findMember.setAge(20); // UPDATE 쿼리 호출
실행 결과
Hibernate:
/* insert for
jpql.Member */insert
into
Member (age, TEAM_ID, username, id)
values
(?, ?, ?, ?)
Hibernate:
/* select
m
from
Member as m */ select
m1_0.id,
m1_0.age,
m1_0.TEAM_ID,
m1_0.username
from
Member m1_0
Hibernate:
/* update
for jpql.Member */update Member
set
age=?,
TEAM_ID=?,
username=?
where
id=?
List<Member> list = em.createQuery("select m.address from Member m", Member.class).getResultList();
// 반환 타입이 age(숫자), username(문자)이기에 명확한 반환 타입이 아니므로 Query를 사용
Query query = em.createQuery("select m.age, m.username from Member m");
List resultList = query.getResultList();
Iterator iterator = resultList.iterator();
while (iterator.hasNext()) {
Object[] row = (Object[]) iterator.next();
int age = (int) row[0];
String username = (String) row[1];
System.out.println(username + " : " + age);
}
List<Object[]> resultList = em.createQuery("select m.age, m.username from Member m").getResultList();
for (Object[] objects : resultList) {
int age = (Integer) objects[0];
String username = (String) objects[1];
System.out.println(username + " : " + age);
}
List<MemberDTO> resultList = em.createQuery("select new jpql.MemberDTO(m.username, m.age) from Member as m", MemberDTO.class).getResultList();
MemberDTO memberDTO = resultList.get(0);
setFirstResult(int startPosition)
: 조회 시작 위치(0부터 시작)setMaxResults(int maxResult)
: 조회할 데이터 수public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
for (int i = 0; i < 100; i++) {
Member member = new Member();
member.setUsername("member" + i);
member.setAge(i);
em.persist(member);
}
em.flush();
em.clear();
///////////////////////////////////////////////////////////////////
List<Member> list = em.createQuery("select m from Member as m order by m.age desc", Member.class)
.setFirstResult(1)
.setMaxResults(10)
.getResultList();
///////////////////////////////////////////////////////////////////
for (Member member : list) {
System.out.println("member = " + member);
}
et.commit();
} catch (Exception e) {
et.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
Team team = new Team();
team.setName("team");
em.persist(team);
Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(10);
Member member2 = new Member();
member2.setUsername("member2");
member2.setAge(20);
member1.changeTeam(team);
member2.changeTeam(team);
em.persist(member1);
em.persist(member2);
em.flush();
em.clear();
//////////////////////////////////////////////////////////////////
// 내부 조인
// m.team을 별칭 t로 설정
String query = "select m from Member as m inner join m.team t";
List<Member> list = em.createQuery(query, Member.class)
.getResultList();
//////////////////////////////////////////////////////////////////
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
m
from
Member as m
inner join
m.team t */ select
m1_0.id,
m1_0.age,
m1_0.TEAM_ID,
m1_0.username
from
Member m1_0
join
Team t1_0
on t1_0.id=m1_0.TEAM_ID
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
Team team = new Team();
team.setName("team");
em.persist(team);
Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(10);
Member member2 = new Member();
member2.setUsername("member2");
member2.setAge(20);
member1.changeTeam(team);
member2.changeTeam(team);
em.persist(member1);
em.persist(member2);
em.flush();
em.clear();
String query = "select m from Member as m left join m.team t";
List<Member> list = em.createQuery(query, Member.class)
.getResultList();
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
m
from
Member as m
left join
m.team t */ select
m1_0.id,
m1_0.age,
m1_0.TEAM_ID,
m1_0.username
from
Member m1_0
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpql");
EntityManager em = emf.createEntityManager();
EntityTransaction et = em.getTransaction();
et.begin();
try {
Team team = new Team();
team.setName("team");
em.persist(team);
Member member1 = new Member();
member1.setUsername("member1");
member1.setAge(10);
Member member2 = new Member();
member2.setUsername("member2");
member2.setAge(20);
member1.changeTeam(team);
member2.changeTeam(team);
em.persist(member1);
em.persist(member2);
em.flush();
em.clear();
/////////////////////////////////////////////////////////////
String query = "select m from Member m, Team t where m.username = t.name";
List<Member> list = em.createQuery(query, Member.class)
.getResultList();
/////////////////////////////////////////////////////////////
et.commit();
} catch (Exception e) {
et.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* select
m
from
Member m,
Team t
where
m.username = t.name */ select
m1_0.id,
m1_0.age,
m1_0.TEAM_ID,
m1_0.username
from
Member m1_0,
Team t1_0
where
m1_0.username=t1_0.name
Ex. 회원과 팀을 조회하면서 회원과 연관된 팀을 조회(팀 이름이 A인 것만)
select m, t from Member m left join m.team t on t.name = 'A'
Ex. 회원의 이름과 팀의 이름이 같은 대상 외부 조인
select m, t from Member m LEFT JOIN Team t on m.username = t.name
NOT EXISTS
(Subquery)ALL, ANY, SOME
(Subquery)NOT IN
(Subquery)public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setName("멤버");
member.setAge(68);
member.setMemberType(MemberType.USER);
em.persist(member);
em.flush();
em.clear();
//////////////////////////////////////////////////////
String query =
"select " +
"case when m.age <= 10 then '학생요금'" +
" when m.age >= 60 then '경로요금'" +
" else '일반요금'" +
"end " +
"from Member as m";
List<String> resultList = em.createQuery(query, String.class)
.getResultList();
//////////////////////////////////////////////////////
for (String s : resultList) {
System.out.println("s = " + s);
}
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setName(null);
member.setAge(68);
member.setMemberType(MemberType.USER);
em.persist(member);
em.flush();
em.clear();
//////////////////////////////////////////////////////
String query = "select coalesce(m.name, '이름 없는 회원') from Member as m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
//////////////////////////////////////////////////////
for (String s : result) {
System.out.println("s = " + s);
}
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();
try {
Member member = new Member();
member.setName("관리자");
member.setAge(41);
member.setMemberType(MemberType.ADMIN);
em.persist(member);
em.flush();
em.clear();
//////////////////////////////////////////////////////
String query = "select nullif(m.name, '관리자') from Member as m";
List<String> result = em.createQuery(query, String.class)
.getResultList();
//////////////////////////////////////////////////////
for (String s : result) {
System.out.println("s = " + s);
}
transaction.commit();
} catch (Exception e) {
transaction.rollback();
} finally {
em.close();
}
emf.close();
}
}