JPA6

JPQL

JPQL

JPQL Query


JDBC처럼 쿼리문을 작성하여 실행시킬 수 있게 해주는 기능이다.

sql의 table명, column명이 기준이 아니라 java의 class명, 멤버 변수명을 기준으로 한다.

따라서 Member class로 member란 이름의 sql entity table을 생성할 시에는 JPQL Query로는 Member라고 명확히 선언해주어야 한다.

String jpql = "select m from Member m where m.age < 10";
List<Member> resultList = em.createQuery(jpql, Member.class).getResultList();

jpql = "select m from Member m join m.teamId t where t.id=1l";
List<Member> resultList = em.createQuery(jpql, Member.class).getResultList();

jpql = "select LOWER(e.ename) from Employee e";
List<String> employees =  em.createQuery(jpql).getResultList();

jpql = "select max(e.salary) from Employee e";
int maxSal = (int)em.createQuery(jpql).getSingleResult();

jpql = "select e from Employee e where e.salary between 800 and 3000";
List<Employee> e1 =  em.createQuery(jpql, Employee.class).getResultList();
			
jpql = "select e from Employee e where e.ename like 'M%'";
List<Employee> e2 =  em.createQuery(jpql, Employee.class).getResultList();
			
jpql = "select e.ename from Employee e order by e.ename asc";
List<String> e3 =  em.createQuery(jpql).getResultList();


@NameQuery


Query문에 이름을 붙여서 이후에도 간단하게 호출해서 사용할 수 있도록 해준다.

프로그램 실행 시 자동으로 SQL문에 대한 검증도 이뤄지기 때문에 간단한 쿼리문에 대해서는 유용한 기능이다.

@NamedQuery(query="select d from Department d", name="Department.findAll")
@NamedQuery(query="select d from Department d where d.deptno=:deptno", name="Department.findByDeptno")
@NamedQuery(query="select d from Department d where d.dname=:dname", name="Department.findByDname")

List<Department>d1 = em.createNamedQuery("Department.findAll").getResultList();
Department d2 = (Department) em.createNamedQuery("Department.findByDeptno").setParameter("deptno", deptno)
Department d3 = (Department) em.createNamedQuery("Department.findByDname").setParameter("dname", dname)


NativeQuery


JPQL처럼 쿼리문을 작성하여 실행시킬 수 있게 해주는 기능이다.

다만 Native란 말처럼 사용하는 DB의 구문을 직접 입력해서 사용한다.


List<Product> p = em.createNativeQuery("select * from Product", Product.class).getResultList();
List<Product> p = em.createNativeQuery("select * from Product where pno=?", Product.class)
		.setParameter(1, productNo).getResultList();

Discussion and feedback