๐Ÿ• Reference

์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ : ๊ต๋ณด๋ฌธ๊ณ 
์ž๋ฐ” ORM ํ‘œ์ค€ JPA ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๊ธฐ๋ณธํŽธ : ์ธํ”„๋Ÿฐ

JPQL

Java Persistence Query Language

JPA ์—์„œ ์ œ๊ณตํ•˜๋Š” SQL ์„ ์ถ”์ƒํ™”ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์ฟผ๋ฆฌ ์–ธ์–ด


ํ…Œ์ด๋ธ” ๋Œ€์ƒ์ด ์•„๋‹Œ ๊ฐ์ฒด ๋Œ€์ƒ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
SQL ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • JOIN
    ๋“ฑ์„ ์ง€์› ํ•œ๋‹ค.

    JPA COMMMIT ์‹œ์ ์— SQL Query ๋กœ ๋ณ€ํ™˜๋˜์–ด DB ์— ์ ์šฉ๋œ๋‹ค.

์žฅ์ 

  1. ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— DB ์— ์˜์กด์ ์ด์ง€ ์•Š๋‹ค.
  2. ANSI ํ‘œ์ค€ SQL ๋Œ€๋ถ€๋ถ„์„ ์ง€์›ํ•œ๋‹ค.
  3. ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.

๋‹จ์ 

  1. ์ฟผ๋ฆฌ์ž‘์„ฑ์„ ๋ฌธ์ž์—ด๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Compile ์‹œ์ ์—์„œ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  2. ๋™์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  3. ์กฐ์ธ, ๊ทธ๋ฃนํ™”, ์ •๋ ฌ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์—์„œ ์ž์ฒด์ ์ธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ Learning Curve ์กด์žฌ

์‚ฌ์šฉ๋ฐฉ๋ฒ•

Member

@Entity
public class Member
{
    @Id @GeneratedValue
    private Long id;
    private String username;

    private int age;

1.ํŠน์ง•

Entity , property ๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„์„ ํ•œ๋‹ค.
Entity ์™€ Table ์ด๋ฆ„์€ ๊ฐ™์ง€ ์•Š๋‹ค. ->Entity ์ด๋ฆ„ ์จ์•ผํ•œ๋‹ค.
๋ณ„์นญ์€ ํ•„์ˆ˜๋‹ค.

2.TypedQuery vs Query ํƒ€์ž…

TypedQuery : JPQL ๊ฒฐ๊ณผ ํƒ€์ž…์ด ์ •ํ•ด์กŒ์„๋•Œ,
TypedQuery : JPQL ๊ฒฐ๊ณผ ํƒ€์ž…์ด ์ •ํ•ด์ง€์ง€ ์•Š์„ ๋•Œ,

JPQL ๊ฒฐ๊ณผ ํƒ€์ž…์ด ์ •ํ•ด์กŒ์„๋•Œ

QUERY

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 ๊ฒฐ๊ณผ ํƒ€์ž…์ด ์ •ํ•ด์กŒ์„๋•Œ

QUERY

select m.username, m.age from Member m
---
Query              query2 = em.createQuery("select m.username, m.age from Member m");

Return Type ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฌธ์ž์—ด๊ณผ ์ •์ˆ˜ ๋‘๊ฐœ๋กœ ๋ฐ›์„๋•Œ์™€ ๊ฐ™์ด
์–ด๋А ํŠน์ • ํƒ€์ž…์ด๋ผ๊ณ  ์ •ํ•˜๊ธฐ ์–ด๋ ค์šด ์ƒํƒœ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

3. getResultList() vs getSingleResult()

document

์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค

1.getResultList()

  • ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜๊ฐ€ ๋ณต์ˆ˜ ์ผ๋•Œ ์‚ฌ์šฉ
  • return ๊ฐ’์ด List
  • Query ๊ฒฐ๊ณผ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 0 ์ธ ๋นˆ List ๋ฅผ ๋ฐ˜ํ™˜
    main
        try
        {
//            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)

๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

4. Parameter Binding ( ์ด๋ฆ„ vs ์œ„์น˜ )

์ด๋ฆ„ ๋ฐ”์ธ๋”ฉ

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 ์ ˆ์— ์กฐํšŒํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

Member

@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;

Team

@Entity
public class Team
{
    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

Address

@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;

1. ์ „์ฒด ์†์„ฑ ์กฐํšŒ

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 ๋ฐœ์ƒ )

2. ์—ฐ๊ด€๊ด€๊ณ„ ์†์„ฑ ์กฐํšŒ

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

3. Embedded Type ์กฐํšŒ

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 ํƒ€์ž…์„ ์กฐํšŒ

4. Scala ํƒ€์ž… ์กฐํšŒ

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 )

  • ์ƒ๊ฐ๋ณด๋‹ค ์ง๊ด€์ ์ธ API ๋ฅผ ์‚ฌ์šฉ

    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 ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JOIN

1. Inner Join

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}

2. Outer Join

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}

3. Setter Join

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

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}

์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š” JOIN

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}

SUB QUERY

์ผ๋ฐ˜์ ์ธ SQL ์—์„œ ์ง€์›ํ•˜๋Š” SUB QUERY ๋ฅผ ์ง€์›ํ•œ๋‹ค.
์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ง€์›ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JPQL ํƒ€์ž… ํ‘œํ˜„

  • ๋ฌธ์ž : 'a'
  • ์ˆซ์ž : 1L, 1D, 1F
  • ๋ถˆ๋ฆฐ : TRUE, FALSE
  • ENUM : ํŒจํ‚ค์ง€๋ช… ํฌํ•จ

ENUM TYPE

select m.username, m.memberType from Member m where m.memberType = :userType

public enum MemberType {
    ADMIN,USER;
}

Member

@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;

main

        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 ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN