2012-11-16 3 views
0

두 개의 Entities Cats and Licks가 있다고 가정 해 보겠습니다. 각각에는 다른 하나의 목록이 있습니다. JPA를 써서 다른 사람의 ID를 얻으면 어떻게 찾을 수 있습니까?JPA를 사용하여 목록에 가입하는 방법

내 질문은 이것입니다. 더 간단하게 만들지 않겠습니까? 이 인터페이스는 혼란 스럽습니다 ...하지만 어쨌든 당신이 그것을하는 방법입니다.

@PersistenceContext 
protected EntityManager em; 

@Test 
public void testFindCatsByLickId() throws Exception 
{ 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery cq = cb.createQuery(); 

    Root<Cat> cats = cq.from(Cat.class); 
    Root<Lick> licks = cq.from(Lick.class); 
    ListJoin<Cat, Lick> joinCatL = cats.join(Cat_.lickList); 

    // just creating the following ListJoin object will cause this query to fail! 
    // ListJoin<Lick, Cat> joinLCat = lick.join(Lick_.catList); 

    Predicate p = cb.and( 
          cb.equal(licks.get(Lick_.lickId), new Integer(2)) 
         , cb.equal(licks, joinCatL) 
         ); 

    cq.select(cats).where(p); 

TypedQuery query = em.createQuery(cq); 

    List<Cat> list = query.getResultList(); 

    assertList(list); 
    assertTrue(null != list && ! list.isEmpty()); 
} 
+0

대기 당신은 질문을하거나 자신의 대답입니까? 나는 이것이 무엇을하고 있는지 혼란 스럽다. – Woot4Moo

답변

0

기준 API는 선택적인 검색 기준 세트에서 검색어를 동적으로 작성해야 할 때 유용합니다. 전혀 쿼리하지 않고,

String jpql = "select cat from Lick lick inner joinlick.cats cat where lick.id = :lickId"; 
List<Cat> cats = em.createQuery(jpql, Cat.class).setParameter("lickId", 2) 
        .getResultList(); 

심지어 간단한 :이 경우, JPQL를 사용하는 것이 훨씬 더 간단하고 읽을 수있는 코드로 연결

Lick lick = em.get(Lick.class, 2); 
List<Cat> cats = lick.getCats(); 
+1

문제는 지연 바인딩이며 쿼리의 어떤 부분을 필요로하거나 필요로하지 않을지 모르는 것입니다. 그 일이 시작되면 언제나 기준 API가 필요합니다. 위와 같은 쿼리를 설정하는 방법을 찾는 것이 어려웠습니다. 내가 마침내 그것을 알아 냈을 때, 나는 다른 사람들을 찾기 위해 여기에 있는지 확인하기로 결정했다. 그래서, 아니, 정말로, 질문이 아니지만 ... 많은 좌절감이 있습니다. –

관련 문제