简体   繁体   English

Spring数据规范,如何在LIKE中查询@OneToMany关系?

[英]Spring Data Specifications, how to query LIKE for a @OneToMany relationship?

I have an entity, called "Client", which contains a List users. 我有一个名为“客户端”的实体,其中包含一个列表用户。

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

I want to write a query which does something like: 我想编写一个查询,该查询类似于:

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

Does anyone know how to do with using Specifications? 有人知道如何使用规格吗?

Normally, if there was one user, I would do something like this below. 通常,如果有一个用户,我将在下面执行以下操作。 But since we have here a List I am not sure how to approach this situation. 但是由于我们这里有一个列表,所以我不确定如何处理这种情况。

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));

If I wanted to compare an equal, I could construct a User object and do something like this: 如果我想比较一个相等的对象,则可以构造一个User对象并执行以下操作:

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

I could do something like: 我可以做类似的事情:

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

But then what? 但是那又怎样呢?

Thanks, Joachim 谢谢,约阿希姆

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

findByClientAndRoleAndNameLike(Client client, String role, String name)

You can use JPA entity manager query to do something like that : 您可以使用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();

You can find more about this here 您可以在这里找到更多关于此的信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM