em.find()는 식별자로만 객체를 탐색하기 때문에 한계가 있습니다.
이를 위해 객체지향 쿼리를 사용합니다.
객체지향 쿼리는 객체를 대상으로 검색을하는 객체지향 쿼리입니다. 특정 SQL에 의존하지 않습니다.
SELECT m.name은 정상실행 되지만 SELECT m.Name 대소문자가 틀리면 QueryException 이 발생 합니다query.getResultList()는 결과를 리스트로 반환합니다. 결과가 없으면 빈 리스트를 반환합니다.query.getSingleResult()는 결과가 정확히 하나일 때 사용합니다. 결과가 없으면 NoResultException 예외가 발생하고, 둘 이상이면 NonUniqueResultException 예외가 발생합니다.
TypedQuery<String> query = em.createQuery("SELECT m.Name FROM Member m where m.age > 20", String.class);
-----
Caused by: org.hibernate.QueryException: **could not resolve property: Name** of: org.example.ch10.jpql.entity.Member [SELECT m.Name FROM org.example.ch10.jpql.entity.Member m where m.age > 20]
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> resultList = query.getResultList();
resultList.forEach(member -> System.out.println(member.getName()));
-----
Hibernate:
select
member0_.MEMBER_ID as member_i1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.name as name6_0_,
member0_.TEAM_ID as team_id7_0_
from
Member member0_
TypedQuery<String> query = em.createQuery("SELECT m.name FROM Member m where m.age > 20", String.class);
List<String> resultList = query.getResultList();
-----
Hibernate:
select
member0_.name as col_0_0_
from
Member member0_
where
member0_.age>20
Query query = em.createQuery("SELECT m.id, m.name FROM Member m");
List resultList = query.getResultList();
resultList.forEach(o -> {
Object[] object = (Object[]) o;
System.out.println("id: " + object[0]);
System.out.println("name: " + object[1]);
});
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m", Member.class);
List<Member> resultList = query.getResultList();
resultList.forEach(member -> System.out.println(member.getName()));
WHERE m.name = :name 이 부분에 :name 이 파라미터 바인딩 입니다.
파라미터를 셋팅 할 때 name이란 이름으로 바인딩하면 됩니다.
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m WHERE m.name = :name", Member.class);
query.setParameter("name", "kim");
?를 사용합니다.
TypedQuery<Member> query = em.createQuery("SELECT m FROM Member m WHERE m.name = ?1", Member.class);
query.setParameter(1, "kim");
SELECT 절에 조회활 대상을 지정하는 것을 프로젝션이라고 합니다.
List<Member> resultList = em.createQuery("SELECT m FROM Member m", Member.class).getResultList();
List<Address> resultList = em.createQuery("SELECT o.address FROM Order o", Address.class).getResultList();
List<String> resultList = em.createQuery("SELECT m.name FROM Member m", String.class).getResultList();
List<Double> ageAverage = em.createQuery("SELECT AVG(m.age) FROM Member m", Double.class).getResultList();
Object[] 타입으로 조회합니다.
List<Object[]> resultList = em.createQuery("SELECT o.member, o.product, o.orderAmount FROM Order o").getResultList();
resultList.forEach(objects -> {
Member member = (Member) objects[0];
System.out.println("member = " + member.getName());
Product product = (Product) objects[1];
System.out.println("product = " + product.getName());
int orderAmount = (int) objects[2];
System.out.println("orderAmount = " + orderAmount);
});
List<MemberDto> resultList = em.createQuery("SELECT new org.example.ch10.jpql.dto.MemberDto(m.name, m.age) FROM Member m", MemberDto.class).getResultList();
이 두개만 설정하면 됩니다.
setFirstResult(int startPosition), setMaxResults(int maxResult)
List<Member> resultList = em.createQuery("SELECT m FROM Member m", Member.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
Hibernate:
select
member0_.MEMBER_ID as member_i1_0_,
member0_.city as city2_0_,
member0_.street as street3_0_,
member0_.zipcode as zipcode4_0_,
member0_.age as age5_0_,
member0_.name as name6_0_,
member0_.TEAM_ID as team_id7_0_
from
**Member member0_ limit ? offset ?**