JPA CriteriaQuery - Как использовать оператор сравнения IN - PullRequest
0 голосов
/ 07 мая 2018

У меня есть два объекта Java.

  1. Пользователь (у каждого пользователя есть столбец индекса)
  2. Адрес (каждый адрес также имеет столбец user_index)

У меня есть Список всех индексов пользователей, usersIndexList в качестве заданного ввода, и я хочу получить все объекты адреса на основе этого usersIndexList. Я нашел пример в другой теме. И пытался следовать этому, но это не работает.

JPA CriteriaBuilder - Как использовать оператор сравнения "IN"

Мой код:

List<String> usersIndexList= new ArrayList<String> ();
for (User u : usersList) {
    usersIndexList.add(u.getIndex());
}

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<User> subQuery = criteriaBuilder.createQuery(User.class);
    Root<User> fromUser= subQuery.from(User.class);

    Expression<String> exp = fromUser.get("user_index");
    Predicate predicate = exp.in(usersIndexList);

    subQuery.where(predicate);

    TypedQuery<User> query = getEntityManager().createQuery(subQuery);

    return query.getResultList();

Но этот запрос не возвращает желаемый результат: (

Может кто-нибудь сказать мне, где я делаю неправильно, или дать мне альтернативные решения, если это возможно через nativequery или namedquery или любым другим способом

1 Ответ

0 голосов
/ 08 мая 2018

В соответствии с вашим вопросом, вы хотите получить все адресные объекты на основе этого usersIndexList. Но в вашем коде вы выбираете User объектов, а не Address. Правильно ли мое понимание? Если да, тогда, пожалуйста, измените ваш корень на Address, как показано ниже -

List<String> usersIndexList= new ArrayList<String> ();
for (User u : usersList) {
    usersIndexList.add(u.getIndex());
}

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Address> subQuery = criteriaBuilder.createQuery(Address.class);
    Root<Address> fromAddress= subQuery.from(Address.class);

    Expression<String> exp = fromAddress.get("user_index");
    Predicate predicate = exp.in(usersIndexList);

    subQuery.where(predicate);

    TypedQuery<Address> query = getEntityManager().createQuery(subQuery);

    return query.getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...