0

2 つのエンティティ Cats と Licks があるとします。それぞれに他のリストがあります。もう一方の 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() );
}
4

1 に答える 1

0

基準 API は、一連のオプションの検索基準からクエリを動的に作成する必要がある場合に役立ちます。この場合、JPQL を使用すると、はるかに単純で読みやすいコードになります。

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();

または、クエリをまったく使用せずに、さらに簡単に:

Lick lick = em.get(Lick.class, 2);
List<Cat> cats = lick.getCats();
于 2012-11-16T23:52:34.037 に答える