Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JPA加入列表_Java_Jpa 2.0_Ejb 3.0 - Fatal编程技术网

Java 如何使用JPA加入列表

Java 如何使用JPA加入列表,java,jpa-2.0,ejb-3.0,Java,Jpa 2.0,Ejb 3.0,假设你有两个实体猫和舔。每个人都有一张对方的名单。考虑到另一个的id,如何编写JPA来查找其中一个 我的问题是:为什么不让它变得更简单?这个界面很混乱。。。但这是你怎么做的 @PersistenceContext protected EntityManager em; @Test public void testFindCatsByLickId() throws Exception { CriteriaBuilder cb = em.getCriteriaBuilder();

假设你有两个实体猫和舔。每个人都有一张对方的名单。考虑到另一个的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() );
}
@PersistenceContext
受保护的实体管理器em;
@试验
public void testFindCatsByLickId()引发异常
{
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery();
根猫=cq.from(猫类);
根舔=cq.from(舔类);
ListJoin-joinCatL=cats.join(Cat.lickList);
//仅创建以下ListJoin对象将导致此查询失败!
//ListJoin-joinLCat=lick.join(lick.catList);
谓词p=cb.和(
cb.equal(licks.get(Lick_.lickId),新整数(2))
,cb.相等(舔,接合)
);
cq.选择(猫)。其中(p);
TypedQuery=em.createQuery(cq);
List=query.getResultList();
资产清单(清单);
assertTrue(null!=list&&!list.isEmpty());
}

当您需要从一组可选搜索条件动态组合查询时,criteria 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();
String jpql=“从Lick-Lick-internal-joinlick.cats cat中选择cat,其中Lick.id=:lickId”;
List cats=em.createQuery(jpql,Cat.class).setParameter(“lickId”,2)
.getResultList();
甚至更简单,根本不需要任何查询:

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

等等,你是在问问题还是在回答自己的问题?我不明白这是什么意思。问题是绑定太晚,不知道您可能需要或不需要查询的哪些部分。当这种情况开始发生时,而且总是这样,您需要CriteriaAPI。我发现很难找到如何设置上述查询。当我最终弄明白的时候,我决定确保它是在这里为其他人找到的。所以,不,这不是一个真正的问题…但有很多挫折。