繁体   English   中英

JPA查询以混合成员和集合作为参数

[英]JPA query to mix member of and collection as parameter

我从JPA查询开始。 我试图找出如何将集合设置为where子句“ member”的参数。 采用Ultimate JPA查询和技巧列表–第1部分中描述的模型

private static boolean isThisDogBelongingToAperson(EntityManager em, Dog dog, String name) {
  Query query = em.createQuery('select count(p) from Person p where :dog member of p.dogs and p.name = :name');
  query.setParameter('dog', dog);
  query.setParameter('name', name);
  try {
   return query.getSingleResult() != null;
  } catch (Exception e) {
   return false;
  }
}

这仅将Dog的一个实例作为参数。 如果我有一条狗和猫的清单来创建一个名为“ isAnyOfTheseDogsBelongingToAperson”之类的方法,该怎么办? 我是否需要为Dog列表的每个元素多次调用上述方法,或者是否可以将集合传递给查询? 例如:

private static boolean isAnyOfTheseDogsBelongingToAperson(EntityManager em, List<Dog> dogs, String name) {
  Query query = em.createQuery('select count(p) from Person p where :dogs member of p.dogs and p.name = :name');
  query.setParameter('dogs', dogs);
  query.setParameter('name', name);
  try {
   return query.getSingleResult() != null;
  } catch (Exception e) {
   return false;
  }
}

如果仅增加“ isAnyOfTheseDogsBelongingToAperson”方法的循环该怎么办? 尝试这样的事情:

private static boolean isAnyOfTheseDogsBelongingToAperson(EntityManager em, List<Dog> dogs, String name) {
  for (Dog dog : dogs){
      Query query = em.createQuery('select count(p) from Person p where :dog member of p.dog and p.name = :name');
      query.setParameter('dog', dog);
      query.setParameter('name', name);
      try {
       return query.getSingleResult() != null;
      } catch (Exception e) {
       return false;
      }
  }
}

否则,您可以尝试与列表的.contains方法进行比较。 为此,请参见以下代码:

private static boolean isAnyOfTheseDogsBelongingToAperson(EntityManager em, List<Dog> dogs){
    boolean result = false;
    List<Dog> dogsWithOwners = new ArrayList<Dog>();
    Query query = em.createQuery('select p.dog from Person');
    dogsWthOwners = query.getResultList();
    for (Dog dog : dogs){
        if (dogsWithOwners.contains(dog){
            result = true;
        }
    }
    return result;
}

希望这可以帮助您,祝您好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM