Spring Data Specifications,如何查询LIKE以获取@OneToMany关系?

时间:2015-05-21 14:05:51

标签: java spring jpa spring-data spring-data-jpa

我有一个名为“Client”的实体,其中包含一个List用户。

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 user = new User();
// set properties
queryPredicates.add(cb.isMember(user, root.<Collection<User>>get("users")));

我可以这样做:

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

但接着是什么?

谢谢, 勒夫

2 个答案:

答案 0 :(得分:1)

解决方案可以在用户端,即在UserRepository中:

findByClientAndRoleAndNameLike(Client client, String role, String name)

答案 1 :(得分: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

的更多信息