JPA CriteriaBuilder – Как использовать оператор сравнения «IN»

Не могли бы вы помочь мне, как преобразовать следующие коды в использование оператора «in» в построителе критериев? Мне нужно фильтровать, используя список / массив имен пользователей, используя «in».

Я также попытался выполнить поиск с использованием метода JPA CriteriaBuilder – «in», но не смог найти хороший результат. Поэтому я был бы очень признателен, если бы вы могли дать мне ссылки на эту тему. Благодарю.

Вот мои коды:

//usersList is a list of User that I need to put inside IN operator CriteriaBuilder builder = getJpaTemplate().getEntityManagerFactory().getCriteriaBuilder(); CriteriaQuery criteria = builder.createQuery(ScheduleRequest.class); Root scheduleRequest = criteria.from(ScheduleRequest.class); criteria = criteria.select(scheduleRequest); List params = new ArrayList(); List<ParameterExpression> usersIdsParamList = new ArrayList<ParameterExpression>(); for (int i = 0; i < usersList.size(); i++) { ParameterExpression usersIdsParam = builder.parameter(String.class); params.add(builder.equal(scheduleRequest.get("createdBy"), usersIdsParam) ); usersIdsParamList.add(usersIdsParam); } criteria = criteria.where(params.toArray(new Predicate[0])); TypedQuery query = getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(criteria); for (int i = 0; i < usersList.size(); i++) { query.setParameter(usersIdsParamList.get(i), usersList.get(i).getUsername()); } List scheduleRequestList = query.getResultList(); 

Внутренняя строка запроса преобразуется ниже, поэтому я не получаю записи, созданные двумя пользователями, потому что она использует «И».

 select generatedAlias0 from ScheduleRequest as generatedAlias0 where ( generatedAlias0.createdBy=:param0 ) and ( generatedAlias0.createdBy=:param1 ) order by generatedAlias0.trackingId asc 

Если я хорошо понимаю, вы хотите присоединиться к ScheduleRequest с User и применить предложение in к свойству userName объекта User .

Мне нужно немного поработать над этой схемой. Но вы можете попробовать с этим трюком, который гораздо читабельнее, чем код, который вы опубликовали, и избегает части Join (потому что он обрабатывает логику Join вне запроса Criteria Query).

 List myList = new ArrayList (); for (User u : usersList) { myList.add(u.getUsername()); } Expression exp = scheduleRequest.get("createdBy"); Predicate predicate = exp.in(myList); criteria.where(predicate); 

Чтобы написать более безопасный код, вы также можете использовать Metamodel, заменив эту строку:

 Expression exp = scheduleRequest.get("createdBy"); 

с этим:

 Expression exp = scheduleRequest.get(ScheduleRequest_.createdBy); 

Если это сработает, вы можете попытаться добавить логику Join в Criteria Query . Но сейчас я не могу проверить это, поэтому я предпочитаю видеть, хочет ли кто-нибудь еще попробовать.

Не лучший ответ, хотя могут быть fragmentы кода.

 public  List findListWhereInCondition(Class clazz, String conditionColumnName, Serializable... conditionColumnValues) { QueryBuilder queryBuilder = new QueryBuilder(clazz); addWhereInClause(queryBuilder, conditionColumnName, conditionColumnValues); queryBuilder.select(); return queryBuilder.getResultList(); } private  void addWhereInClause(QueryBuilder queryBuilder, String conditionColumnName, Serializable... conditionColumnValues) { Path path = queryBuilder.root.get(conditionColumnName); In in = queryBuilder.criteriaBuilder.in(path); for (Serializable conditionColumnValue : conditionColumnValues) { in.value(conditionColumnValue); } queryBuilder.criteriaQuery.where(in); } 
  • Подсоническое Vs NHibernate
  • Список поставщиков Entity Framework для различных баз данных
  • Указание индекса (не-уникальный ключ) с использованием JPA
  • Перечисление в спящем режиме, сохраняющееся как перечисление
  • Как аннотировать поле автоинкремента MYSQL с аннотациями JPA
  • Как вы можете делать пейджинг с NHibernate?
  • В чем разница между однонаправленными и двунаправленными ассоциациями JPA и Hibernate?
  • Пакетные вставки с JPA / EJB3
  • Hibernate Annotations - Что лучше, поле или доступ к собственности?
  • В чем разница между persist () и merge () в Hibernate?
  • объект ссылается на несохраненный экземпляр переходного процесса - сохраняет временный экземпляр перед промывкой
  • Давайте будем гением компьютера.