2015-01-29 2 views
0

단일 방향 관계가 있습니다. 여기에는 Employee 및 Andress 엔티티가 있습니다. 나는 ADRESS 객체의 배열을 가지고 그 adresses에 매핑 고객 객체의 배열을 반환 조회를 작성하려는배열을 사용한 JPA 조회

@OneToOne(cascade=CascadeType.ALL) 
@JoinColumn(name = "HOME_ADDRESS") 
private Address homeAddress; 

: 직원 엔티티에서 나는 다음과 같은 코드가 있습니다.

select e from Employee e where e.homeAddress.id IN '?' 

나는 무엇을 '?' 부품. 주소 배열을 반복하고 문자열에 ID를 추가하고 위의 쿼리에 매개 변수로 전달하는 유일한 옵션입니까 아니면 배열을 쿼리에 전달하여 동일한 결과를 기대할 수 있습니까?

+1

예 당신은 쿼리가'할 직원 전자에서 전자를 선택합니다'(myIds ID를) 단지'addParameter, 위의 쿼리에'목록 ids'을 통과 할 수있는 e.homeAddress.id IN : ids' –

답변

1

아니요, 문자열로 전달하지 않고 ID 컬렉션으로 전달합니다. 귀하의 질의가 유효하지 않습니다.

String jpql = "select e from Employee e where e.homeAddress.id IN :addresses"; 
Set<Long> addressIds = Arrays.stream(addresses) 
          .map(Address::getId) 
          .collect(Collectors.toSet()); 
return em.createQuery(jpql, Employee.class) 
     .setParameter("addresses", addressIds) 
     .getResultList(); 

이것은 Java 8을 사용하여 주소 배열을 일련의 ID로 변환하지만 물론 goold old for 루프를 사용할 수 있습니다.

1

2 솔루션 :

  1. HQL

    문자열 HQL = "여기서 e.homeAddress.id IN 직원 전자에서 선택 전자 (: 주소)";
    쿼리 쿼리 = getSession(). createQuery (hql);
    query.setParameterList ("addresses", your_list_address_collection);

  2. 기준

    분류 기준 = session.createCriteria (Employee.class); criteria.add (Restrictions.in ("addresses", your_list_address_collection));