【问题标题】:JPA query to mix member of and collection as parameterJPA查询混合成员和集合作为参数
【发布时间】:2014-03-08 19:32:20
【问题描述】:

我从 JPA 查询开始。我试图找出如何将集合设置为“成员” where 子句的参数。 取Ultimate JPA Queries and Tips List – Part 1中描述的Model

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 的一个实例作为参数。如果我有一个狗列表和 wnat 来创建一个名为“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;
  }
}

【问题讨论】:

标签: java hibernate jakarta-ee jpa


【解决方案1】:

如果您只是为您的“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;
}

希望对你有帮助,祝你好运!

【讨论】:

  • 这正是我出于性能目的而试图避免的。
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2012-11-26
相关资源
最近更新 更多