Нужна помощь в кодировании предиката CriteriaQuery "in" - PullRequest
1 голос
/ 28 августа 2011

У меня есть запрос, который я пытался превратить в CriteraQuery, но я не понимаю, как закодировать термин «IN» в запросе.

Запрос JPA, который работает, выглядит следующим образом:

@NamedQuery(name = "User.fromSearchID",
    query = "SELECT q FROM User q,"
    + " IN (q.data) AS s WHERE s.data LIKE :search"
    + " ORDER BY q.id")

И сущность, над которой он работает, выглядит так:

@Entity
public class User {

    @Id private Integer id;

    @OneToMany private List<UserData> data;

    ... }

И ссылка на объект является

@Entity
public class UserData {

    @Id private Long id;

    private String key;

    private String data;

    ... }

Предполагаемый результат (NamedQuery работает) состоит в том, чтобы извлечь все сущности пользователя, которые имеют некоторое совпадение в своем списке атрибутов данных. По какой-то причине синтаксис CriteraQuery ускользает от моей интуиции. Любая помощь?

1 Ответ

1 голос
/ 19 сентября 2011

Я полагаю, пользователи должны быть уникальными?Тогда версия JP QL без довольно старой моды IN:

String searchArgument = "data1";
String query = " SELECT DISTINCT(u) " +
               " FROM User u JOIN  u.data ud " +
               " WHERE ud.data LIKE :search ORDER BY u.id";
List<User> result =em.createQuery(query, User.class).
                setParameter("search", searchArgument).getResultList();

И то же самое с помощью API Criteria:

String searchArgument = "data1";
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> user = cq.from(User.class);

Predicate dataLike = cb.like(user.join("data").<String>get("data"),
                             cb.parameter(String.class, "search"));
cq.distinct(true).select(user)
    .where(dataLike)
    .orderBy(cb.asc(user.get("id")));

TypedQuery<User> findUniqueUserByUserDataData = em.createQuery(cq);
findUniqueUserByUserDataData.setParameter("search", searchArgument);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...