์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ : ๊ต๋ณด๋ฌธ๊ณ
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ : ์ธํ๋ฐ
Java Persistence Query Language
JPA ์์ ์ ๊ณตํ๋ SQL ์ ์ถ์ํํ ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด
ํ ์ด๋ธ ๋์์ด ์๋ ๊ฐ์ฒด ๋์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
SQL ๊ณผ ์ ์ฌํ๋ค.
- SELECT
- FROM
- WHERE
- GROUP BY
- HAVING
- JOIN
๋ฑ์ ์ง์ ํ๋ค.
JPACOMMMIT
์์ ์ SQL Query ๋ก ๋ณํ๋์ด DB ์ ์ ์ฉ๋๋ค.
DB
์ ์์กด์ ์ด์ง ์๋ค.ANSI
ํ์ค SQL ๋๋ถ๋ถ์ ์ง์ํ๋ค.๋ฌธ์์ด
๋ก ํ๊ธฐ ๋๋ฌธ์ Compile ์์ ์์ ๋ฌธ์ ๋ฅผ ํ์
ํ๊ธฐ ํ๋ค๋ค.Learning Curve
์กด์ฌ @Entity
public class Member
{
@Id @GeneratedValue
private Long id;
private String username;
private int age;
Entity
,property
๋ ๋์๋ฌธ์ ๊ตฌ๋ณ์ ํ๋ค.
Entity
์Table
์ด๋ฆ์ ๊ฐ์ง ์๋ค. ->Entity
์ด๋ฆ ์จ์ผํ๋ค.
๋ณ์นญ
์ ํ์๋ค.
TypedQuery
: JPQL ๊ฒฐ๊ณผ ํ์ ์ด ์ ํด์ก์๋,
TypedQuery
: JPQL ๊ฒฐ๊ณผ ํ์ ์ด ์ ํด์ง์ง ์์ ๋,
JPQL ๊ฒฐ๊ณผ ํ์ ์ด ์ ํด์ก์๋
select m from Member m
select m.username from Member m
---
TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class);
Return
Type ์ดMemeber
ํ์ (Entity
) ํน์ ๋จ์ผํ ๊ฐ ํ์ ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ
JPQL ๊ฒฐ๊ณผ ํ์ ์ด ์ ํด์ก์๋
select m.username, m.age from Member m
---
Query query2 = em.createQuery("select m.username, m.age from Member m");
Return
Type ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด๊ณผ ์ ์ ๋๊ฐ๋ก ๋ฐ์๋์ ๊ฐ์ด
์ด๋ ํน์ ํ์ ์ด๋ผ๊ณ ์ ํ๊ธฐ ์ด๋ ค์ด ์ํ์์ ์ฌ์ฉํ๋ค.
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์์ ๋ฐ๋ผ์ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ๋ฌ๋ผ์ง๋ค
1.getResultList()
- ๋ฐํํ๋ ๊ฒฐ๊ณผ ๊ฐ์๊ฐ ๋ณต์ ์ผ๋ ์ฌ์ฉ
- return ๊ฐ์ด
List
- Query ๊ฒฐ๊ณผ๊ฐ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ํฌ๊ธฐ๊ฐ 0 ์ธ ๋น List ๋ฅผ ๋ฐํ
maintry { // Member member = new Member(); // member.setUsername("member1"); // member.setAge(20); // em.persist(member); TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class); List<Member> memberList = query1.getResultList(); System.out.println(memberList.size()); for (Member member1 : memberList) { System.out.println("memberList.size() : "+memberList.size()); }
result
Hibernate: /* select m from Member m */ select member0_.id as id1_0_, member0_.age as age2_0_, member0_.TEAM_ID as TEAM_ID4_0_, member0_.username as username3_0_ from Member member0_ memberList.size() : 0
- ์๋ฌด๊ฒ๋ ์กฐํ๋์ง ์์ ๊ฒฝ์ฐ ํฌ๊ธฐ๊ฐ 0 ์ธ
List
๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.2. getSingleResult()
- ๋จ์ผ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ ์ ์ฌ์ฉํ๋ค.
- ๊ฒฐ๊ณผ๊ฐ ๋ณต์์ด๋ฉด ์์ธ ๋ฐ์ (
NonUniqueResultException
)
Member 2๊ฐ ์์ฑ ํ ์ ์ฒด ์กฐํtry { Member member = new Member(); member.setUsername("member1"); member.setAge(20); em.persist(member); Member member2 = new Member(); member2.setUsername("member1"); member2.setAge(20); em.persist(member2); em.flush(); em.clear(); TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class); Member findMember = query1.getSingleResult();
๊ฒฐ๊ณผ
javax.persistence.NonUniqueResultException: query did not return a unique result: 2 at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:128) at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1560) at org.example.main.getResultListT.main(getResultListT.java:33)
- ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์์ธ ๋ฐ์ (
NoResultException
)
Member ์์ฑ ํ์ง ์๊ณ ์กฐํtry { Member member = new Member(); // member.setUsername("member1"); // member.setAge(20); // em.persist(member); // // Member member2 = new Member(); // member2.setUsername("member1"); // member2.setAge(20); // em.persist(member2); em.flush(); em.clear(); TypedQuery<Member> query1 = em.createQuery("select m from Member m", Member.class); Member findMember = query1.getSingleResult();
๊ฒฐ๊ณผ
javax.persistence.NoResultException: No entity found for query at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1555) at org.example.main.getResultListT.main(getResultListT.java:33)
๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ์ง ์์ ์๋ ์๋๋ฐ ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค.
์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
Main
try
{
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
em.persist(member);
em.flush();
em.clear();
TypedQuery<Member> query1 = em.createQuery("select m from Member m where m.username = :username", Member.class);
query1.setParameter("username","member1");
List<Member> members = query1.getResultList();
for (Member member1 : members) {
System.out.println("name : "+member1.getUsername());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
where
m.username = :username */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as TEAM_ID4_0_,
member0_.username as username3_0_
from
Member member0_
where
member0_.username=?
name : member1
Main
try
{
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
em.persist(member);
em.flush();
em.clear();
TypedQuery<Member> query1 = em.createQuery("select m from Member m where m.username = ?1", Member.class);
query1.setParameter(1,"member1");
List<Member> members = query1.getResultList();
for (Member member1 : members) {
System.out.println("name : "+member1.getUsername());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
where
m.username = :username */ select
member0_.id as id1_0_,
member0_.age as age2_0_,
member0_.TEAM_ID as TEAM_ID4_0_,
member0_.username as username3_0_
from
Member member0_
where
member0_.username=?
name : member1
Parameter ๋ฐ์ธ๋ฉ์ ํตํด JPQL ์ญ์ ๋์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
์ฌ๊ธฐ์์ด๋ฆ
์ผ๋ก ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ์์น
๋ก ๋ฐ์ธ๋ฉ ํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง๋ก ๋๋๋ค.
์ด๋ฆ
์ผ๋ก ๋ฐ์ธ๋ฉ ํ ๊ฒฝ์ฐ Parameter ์ฒ๋ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์์น
๋ก ๋ฐ์ธ๋ฉ ํ ๊ฒฝ์ฐ ์ญ์ Parameter ์ฒ๋ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ์์น ๋ณ๊ฒฝ ์ ์ ์ง๋ณด์์ ์ด๋ ค์์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ ์ด๋ฉด์ด๋ฆ
์ผ๋ก ๋ฐ์ธ๋ฉ ํ๋ ๊ฒ์ด ์ข๋ค.
SELECT ์ ์ ์กฐํํ ๋์์ ์ง์ ํ๋ ๊ฒ์ ๋งํ๋ค.
@Entity
public class Member
{
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY )
@JoinColumn(name = "TEAM_ID")
private Team team;
@Embedded
private Address address;
@Entity
public class Team
{
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
@Embeddable
public class Address
{
public Address(){}
public Address(String city, String street, String zipcode)
{
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
private String city;
private String street;
private String zipcode;
select m from Member m
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m").getResultList();
for (Member member1 : members) {
System.out.println("name : "+member1.getUsername());
member1.setAge(12);
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_
Hibernate:
select
team0_.id as id1_3_0_,
team0_.name as name2_3_0_
from
Team team0_
where
team0_.id=?
name : member1
Hibernate:
/* update
org.example.entity.Member */ update
Member
set
city=?,
street=?,
zipcode=?,
age=?,
TEAM_ID=?,
username=?
where
id=?
Member
์์ ๋ชจ๋ ํ๋๋ค์ ์กฐํ ํ์ผ๋ฉฐ, ์กฐํ ๊ฒฐ๊ณผ์ Member ๋ค์ ๋ชจ๋ ์์์ฑ Context ์์ ๊ด๋ฆฌ ๋๋ค.
(member1.setAge(12);
ํ์ ๋ Update Query ๋ฐ์ )
select m.team from Member m
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
List<Team> teams = em.createQuery("select m.team from Member m", Team.class).getResultList();
for (Team team1 : teams) {
System.out.println("name : "+team1.getName());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m.team
from
Member m */ select
team1_.id as id1_3_,
team1_.name as name2_3_
from
Member member0_
inner join
Team team1_
on member0_.TEAM_ID=team1_.id
name : A
Member
์ ์ฐ๊ด๊ด๊ณ์ธTeam
์ ์กฐํ ํ๋ค. ๊ฐ์ฒด ํ์ ์Team
์ผ๋ก ๋์ด์ผ ํ๋ฉฐ
Query ๋ฐ์ ์JOIN
์ด ์๋์ผ๋ก ๋ฐ์ํ๋ค. ์ฌ์ฉ์ ์ ์ฅ์์JOIN
์ฟผ๋ฆฌ ๊ฐ๋๊ฐ๋ ๊ฒ์ ์ธ์ง ์ํค๊ธฐ ์ํด์ ์ฐ๊ด๊ด๊ณ ์กฐํ ์์ ๋ช ์์ ์ผ๋กJOIN
์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
select m.team from Member m Join m.team t
select m.address from Member m
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
List<Address> addresses = em.createQuery("select m.address from Member m", Address.class).getResultList();
for (Address adr : addresses) {
System.out.println("name : "+adr.getCity());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m.address
from
Member m */ select
member0_.city as col_0_0_,
member0_.street as col_0_1_,
member0_.zipcode as col_0_2_
from
Member member0_
name : 1
Member
์Embedded
ํ์ ์ ์กฐํ
select m.username, m.age from Member m
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member1");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
em.createQuery("select m.username, m.age from Member m").getResultList();
๊ฒฐ๊ณผ
Hibernate:
/* select
m.username,
m.age
from
Member m */ select
member0_.username as col_0_0_,
member0_.age as col_1_0_
from
Member member0_
Member
๋ค๋ฅธ ํ์ ๋ค์ ์กฐํ, ์ฆ ๊ฒฐ๊ณผ๊ฐQuery
ํ์ ์ด๋ค.
- Object ๋ฅผ ๋ฐํ
List scala = em.createQuery("select m.username, m.age from Member m").getResultList(); Object ob = scala.get(0); Object[] obArr = (Object[])ob; System.out.println("result = "+obArr[0]); System.out.println("result = "+obArr[1]);
๊ฒฐ๊ณผ
Hibernate: /* select m.username, m.age from Member m */ select member0_.username as col_0_0_, member0_.age as col_1_0_ from Member member0_ result = member1 result = 20
- DTO ๋ฅผ ์ค์ ํด์ ๊ฐ์ ๋ฐ์ ์ ์๋ค.
DTO ์ ์public class NameAgeDto { private String username; private int age; public NameAgeDto(){} public NameAgeDto(String username, int age) { this.username = username; this.age = age; }
main
List<NameAgeDto> scala = em.createQuery("select new org.example.dto.NameAgeDto(m.username, m.age) from Member m",NameAgeDto.class).getResultList(); NameAgeDto nameAgeDto = scala.get(0); System.out.println("nameAgeDto.getUsername() = "+nameAgeDto.getUsername()); System.out.println("nameAgeDto.getAge() = "+nameAgeDto.getAge());
๊ฒฐ๊ณผ
Hibernate: /* select new org.example.dto.NameAgeDto(m.username, m.age) from Member m */ select member0_.username as col_0_0_, member0_.age as col_1_0_ from Member member0_ nameAgeDto.getUsername() = member1 nameAgeDto.getAge() = 20
select new org.example.dto.NameAgeDto(m.username, m.age) from Member m
- ์๋ก์ด ๋ฐ์ดํฐ ํ์ ์ ์ ์ํ๊ณ
- ์์์ ํ์ ์ด ์ผ์นํ๋
๋ฐ์ดํฐ ํ์ ์์ฑ์๋ฅผ ์ ์
- ๋ฐ์ดํฐ ํ์ ์ ๊ฒฝ๋ก๋ฅผ ํฌํจํ ์์ฑ์๋ฅผ ๊ธฐ์ฌํ๋ฉด
๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
setFirstResult
: ๋ช๋ฒ์งธ ๋ถํฐ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง
setMaxResult
: ๋ช๋ฒ์งธ ๊น์ง ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
for(int i = 0; i< 20; i++)
{
Member member = new Member();
member.setUsername("member"+i);
member.setAge(20+i);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
}
em.flush();
em.clear();
List<Member> members = em.createQuery("select m from Member m order by m.age desc", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
System.out.println("members.size() : "+members.size());
for (Member member : members) {
System.out.println("member.getAge() : "+member.getAge());
}
๊ฒฐ๊ณผ
Hibernate:
select
team0_.id as id1_3_0_,
team0_.name as name2_3_0_
from
Team team0_
where
team0_.id=?
members.size() : 10
member.getAge() : 39
member.getAge() : 38
member.getAge() : 37
member.getAge() : 36
member.getAge() : 35
member.getAge() : 34
member.getAge() : 33
member.getAge() : 32
member.getAge() : 31
member.getAge() : 30
Member
์ ํฌ๊ธฐ๊ฐ10
์ด๊ณ ,age
๊ฐ ํฐMember
๋ถํฐ
๋ด๋ฆผ ์ฐจ์์ผ๋ก 10 ๊ฐ์Member
์ ๋์ด๋ฅผ ์ถ๋ ฅ ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- JPA ๋
DB DIALECT
์ ๋ฐ๋ผPAGINING
์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ํ ์ ์๋ค.
select m from Member m inner join m.team t
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m inner join m.team t";
List<Member> members = em.createQuery(query).getResultList();
for (Member member1 : members) {
System.out.println(member1.toString());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
inner join
m.team t */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_
inner join
Team team1_
on member0_.TEAM_ID=team1_.id
Member{id=2, username='member', age=20, address=org.example.entity.Address@45e9b12d}
select m from Member m left outer join m.team t
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m left outer join m.team t";
List<Member> members = em.createQuery(query).getResultList();
for (Member member1 : members) {
System.out.println(member1.toString());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
left outer join
m.team t */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_
left outer join
Team team1_
on member0_.TEAM_ID=team1_.id
Member{id=2, username='member', age=20, address=org.example.entity.Address@45e9b12d}
select m from Member m, Team t where m.username = t.name
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m, Team t where m.username = t.name";
List<Member> members = em.createQuery(query).getResultList();
for (Member member1 : members) {
System.out.println(member1.toString());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m,
Team t
where
m.username = t.name */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_ cross
join
Team team1_
where
member0_.username=team1_.name
Join ์ ํํฐ๋ง ํ ์ ์๋
ON
์กฐ๊ฑด ์ ์ ์ฌ์ฉํ ์ ์๋ค.
select m from Member m left outer join m.team t on t.name = 'A'
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m left outer join m.team t on t.name = 'A'";
List<Member> members = em.createQuery(query).getResultList();
for (Member member1 : members) {
System.out.println(member1.toString());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
left outer join
m.team t
on t.name = 'A' */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_
left outer join
Team team1_
on member0_.TEAM_ID=team1_.id
and (
team1_.name='A'
)
Member{id=2, username='member', age=20, address=org.example.entity.Address@3bc4ef12}
select m from Member m left join Team t on m.username = t.name
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
em.persist(member);
em.flush();
em.clear();
String query = "select m from Member m left join Team t on m.username = t.name";
List<Member> members = em.createQuery(query).getResultList();
for (Member member1 : members) {
System.out.println(member1.toString());
}
๊ฒฐ๊ณผ
Hibernate:
/* select
m
from
Member m
left join
Team t
on m.username = t.name */ select
member0_.id as id1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.TEAM_ID as TEAM_ID7_0_,
member0_.username as username6_0_
from
Member member0_
left outer join
Team team1_
on (
member0_.username=team1_.name
)
Member{id=2, username='member', age=20, address=org.example.entity.Address@37ad042b}
์ผ๋ฐ์ ์ธ SQL ์์ ์ง์ํ๋
SUB QUERY
๋ฅผ ์ง์ํ๋ค.
์ฌ๋ฌ๊ฐ์ง ์ง์ํจ์์ ๊ฐ์ด ์ฌ์ฉ ํ ์ ์๋ค.
select m.username, m.memberType from Member m where m.memberType = :userType
public enum MemberType {
ADMIN,USER;
}
@Entity
public class Member
{
@Id @GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
@Embedded
private Address address;
@Enumerated(EnumType.STRING)
private MemberType memberType;
try
{
Address address = new Address("1","1","1");
Team team = new Team();
team.setName("A");
em.persist(team);
Member member = new Member();
member.setUsername("member");
member.setAge(20);
member.setTeam(team);
member.setAddress(address);
member.setMemberType(MemberType.ADMIN);
em.persist(member);
em.flush();
em.clear();
String query = "select m.username, m.memberType from Member m where m.memberType = :userType";
List<Object[]> result = em.createQuery(query)
.setParameter("userType",MemberType.ADMIN)
.getResultList();
System.out.println(result.get(0)[0]);
System.out.println(result.get(0)[1]);
๊ฒฐ๊ณผ
Hibernate:
/* select
m.username,
m.memberType
from
Member m
where
m.memberType = :userType */ select
member0_.username as col_0_0_,
member0_.memberType as col_1_0_
from
Member member0_
where
member0_.memberType=?
Parameter Binding ๊ณผ ํจ๊ป ์ฌ์ฉํ์๋ค.