[Spring Boot] JPQL / getResultList() / 파라미터 바인딩

seulki·2022년 12월 12일
0

[springboot]

목록 보기
22/27
post-thumbnail

🎈 객체지향 쿼리 언어(JPQL)

  • JPA 는 다양한 쿼리 방법을 지원
  • JPQL - 권장, 실무사용, 거의 모든 문제 해결 가능
  • JPA Criteria - 자바코드를 짜서 JPA를 빌드해주는 generator 모음 -> 유지보수에 취약
  • QueryDSL -> JPQL 보완, 권장, 실무사용, 쿼리 허용범위 가장 넓음
  • 네이티브 SQL - connect by...
  • JDBC API - MyBatis, SpringJdbcTemplate


✨ JQPL(Java Persistence Query Language)

  • JPA를 사용하면 엔티티 객체를 중심으로 개발
  • 문제는 검색 쿼리이다.
  • 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
  • JPASQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공
  • SQL과 문법 유사, select, from, where, group by, having, join 지원
  • JPQL엔티티 객체를 대상으로 쿼리 작성
  • SQL은 데이터베이스 테이블을 대상으로 쿼리 작성
  • SQL을 추상화해서 특정 데이터베이스에 의존하지 않음
  • JPA는 JPQL을 분석해서 적절한 SQL을 만들어 데이터베이스를 조회


🎈 규칙

  • 엔티티 이름
    -> 테이블명 대신 엔티티명을 사용, @Entity(name = "") 으로 설정 가능
    -> 지정하지 않을 시 클래스 명을 기본값으로 사용(추천)
  • 별칭은 필수
    -> JPQL은 별칭을 필수
    -> AS는 생략 가능


👌JPQL 문법

  • select
    select절
    from절
    where절
    group by절
    having 절
    order by 절

  • update
    update 절
    where 절

  • delete
    delete절
    where절



✨ 함수 - m은 AS(알리아스)

  • count(m) // 회원수
  • sum(m.age) // 나이의 합
  • avg(m.age) // 평균나이
  • max(m.age) // 최대나이
  • min(m.age) // 최소나이


🎈 TypedQuery, Query

  • TypedQuery : 반환 타입이 명확할 때 사용

    		TypedQuery<Member> query = 
    			("select m from member m", Member.class)
    
    		TypedQuery<String> query = 
    			("select m.username from member m", Stringclass)
  • Query : 반환 타입이 명확하지 않을 때 사용 (String, int)

    		Query query = 
    			("select m.username, m.age from member m")

👌 결과조회 API - getResultList()

  • query.getResultList()
    : 결과가 없으면 빈 리스트 반환
    : 빈 collection이 반환되기 때문에, nullPointException에 대한 걱정은 안해도 된다.
  • query.getSingleResult() -> 조심해서 사용해야함 -> 값이 하나도 없을경우 일부러 예외발생시켜야 할 경우 사용하면 좋다.
    : 결과가 정확히 하나일때, 단일 객체 반환
    : 결과가 없을 경우 예외 발생 -> NoReusltException
    : 결과가 둘 이상이면 예외 발생 -> NonUniqueResultException
public class JpaMain6 {

	public static void main(String[] args) {

	EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
	EntityManager em = emf.createEntityManager();
	EntityTransaction tx = em.getTransaction();
	tx.begin();
		
	try {
		List<Member> result = em.createQuery("select m from Member m where m.username like '%kim%'", Member.class).getResultList();
			
		for(Member member : result) {
			System.out.println("member = " + member);
		}
			
		//TypedQuery
		// 타입 정보가 Member로 명확할 때
		TypedQuery<Member> query = em.createQuery("select m from Member m", Member.class);
			
		// 타입정보가 String.class로 반환이 명확할 때
		TypedQuery<String> query2 = em.createQuery("select m.username from Member m", String.class);

		//m.username(String), m.age(int) : 이렇게 반환타입이 명확하지 않을 때
		Query query3 = em.createQuery("select m.username, m.age from Member m");
			
		// getResultList()
		TypedQuery<Member> query4 = em.createQuery("select m from Member m",Member.class);
		List<Member> resultList =  query4.getResultList();
			
		// 결과값 하나일때, getSingleResult()
		TypedQuery<Member> query6 = em.createQuery("select m from Member m where m.id = 10",Member.class);
		Member result2 = query6.getSingleResult();
			
		tx.commit(); 
	} catch (Exception e) {
		tx.rollback();
	}finally {
		em.close();
		emf.close();
		}
	}
}


✨ 파라미터 바인딩 - 이름 기준, 위치 기준

  1. 이름 기준
    select m from Member m where m.username = :username
    query.setPrarameter("username", usernameParam);

  1. 위치 기준(권장하지 않음)
    select m from Member m where m.username = ?1
    query.setPrarameter(1, usernameParam);
  public class JpaMain7 {

	public static void main(String[] args) {

	EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
	EntityManager em = emf.createEntityManager();
	EntityTransaction tx = em.getTransaction();
	tx.begin();
		
	try {
		Member member = new Member();
		member.setUsername("member1");
		member.setAge(10);
		em.persist(member);
			
		// 파라미터 바인딩 - 이름기준			
		TypedQuery<Member> query = em.createQuery("select m from Member m where m.username = :username", Member.class);
		query.setParameter("username", "member1");
		Member result = query.getSingleResult();
		System.out.println("result : " + result.getUsername());
			
			
		// 파라미터 바인딩 - 위치기반(쓰지말것)
		Member result = em.createQuery("select m from m where m.username = ?1", Member.class)
				.setParameter(1, "member1")
				.getSingleResult();
			
		System.out.println("result : " + result.getUsername());
			
		tx.commit(); 
	} catch (Exception e) {
		tx.rollback();
	}finally {
		em.close();
		emf.close();
	}
}
}
profile
웹 개발자 공부 중

0개의 댓글