2015-05-21 2 views
0

У меня есть объект под названием «Клиент», который содержит пользователей списка.Весенние характеристики данных, как запросить LIKE для отношений @OneToMany?

public class Client { 
    @OneToMany(fetch = FetchType.EAGER, mappedBy="client") 
    private List<User> users; 
} 

Я хочу написать запрос, который делает что-то вроде:

SELECT * 
FROM Client client 
JOIN Users user 
ON user.client_id = client.client_id 
WHERE (user.name LIKE '%name%' AND user.role = 'ADMINISTRATOR') 

Кто-нибудь знает, как это сделать с помощью спецификации?

Обычно, если бы был один пользователь, я бы сделал что-то вроде этого ниже. Но поскольку у нас есть Список, я не уверен, как подойти к этой ситуации.

Path<User> user = root.<User> get("user"); 
queryPredicates.add(cb.like(cb.upper(user .<String>get("name")), getLikePattern(queryString))); 
queryPredicates.add(cb.like(cb.upper(user .<String>get("role")), "ADMINISTRATOR)); 

Если бы я хотел сравнить с равным, я мог бы построить объект пользователя и сделать что-то вроде этого:

User user = new User(); 
// set properties 
queryPredicates.add(cb.isMember(user, root.<Collection<User>>get("users"))); 

я мог бы сделать что-то вроде:

Path<List<User>> users = root.<List<User>>get("users"); 

Но что ?

Спасибо, Joachim

+0

ca Не делать это на стороне пользователя? – Jaiwo99

+0

А, да, это можно сделать. Но мне пришлось бы объединить два списка результатов вместо одной спецификации. Позвольте мне попробовать –

ответ

1

Решение может быть на стороне пользователя, т.е. в UserRepository:

findByClientAndRoleAndNameLike(Client client, String role, String name) 
+0

Так что да, это действительно работает. Единственным недостатком является то, что я сначала должен получить уже клиентов List (с некоторыми другими спецификациями), а затем сделать запрос через UserRepository, чтобы найти всех пользователей, которые соответствуют критериям, и добавить их конкретного клиента в уже установленный список. Он работает хорошо, и, возможно, это проще и понятнее, чем делать более продвинутые вещи с помощью спецификаций ... –

0

Вы можете использовать JPA менеджер объект запроса, чтобы сделать что-то вроде этого:

List<Client> clients = (List<Client>) entityManager 
    .createQuery(
     "select c from Client c join c.users u where u.role='ADMISTRATOR' and u.name like :name") 
    .setParameter("name", "foo").getResultList(); 

Вы можете найти более подробную информацию об этом here

Смежные вопросы