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

Java 混合成员和集合作为参数的JPA查询,java,hibernate,jakarta-ee,jpa,Java,Hibernate,Jakarta Ee,Jpa,我从JPA查询开始。我试图找出如何将集合设置为where子句的'member of'参数。 采用中描述的模型 这只是将一个Dog实例作为参数。如果我有一个dogs和wnat的列表来创建一个名为“IsAnyOfDogsBelongingToPerson”的方法,该怎么办。我是否需要为Dog列表的每个元素多次调用上述方法,或者是否有方法将集合传递给查询?例如: private static boolean isAnyOfTheseDogsBelongingToAperson(EntityManage

我从JPA查询开始。我试图找出如何将集合设置为where子句的'member of'参数。 采用中描述的模型

这只是将一个Dog实例作为参数。如果我有一个dogs和wnat的列表来创建一个名为“IsAnyOfDogsBelongingToPerson”的方法,该怎么办。我是否需要为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;
  }
}

如果只是为“IsAnyOfsDogsBelongToPerson”方法增加一个循环,会怎么样?试着这样做:

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;
}

希望这能帮助你,祝你好运

您可以将集合传递给setParameter,如果没有结果,`getSingleResult`也会抛出异常—它不会返回null-,而且这个问题与您的问题类似—这正是我为了性能目的试图避免的问题。
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;
}