JPA CriteriaQuery — как использовать оператор сравнения IN

У меня есть два объекта 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 или любым другим способом.


person Sandra    schedule 07.05.2018    source источник
comment
Для ответа перейдите по ссылке ‹stackoverflow.com/a/2719773/9725064  -  person Viji    schedule 07.05.2018
comment
Для ответа перейдите по ссылке IN Comparison.   -  person Viji    schedule 07.05.2018
comment
ваше формирование запроса правильно. Не могли бы вы объяснить, что вы подразумеваете под But this query is not returning the desired result?   -  person user8826113    schedule 08.05.2018


Ответы (1)


Согласно вашему вопросу, вы хотите получить все объекты адреса на основе этого 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();
person user8826113    schedule 08.05.2018