java - 查找具有多个角色的用户作为 jpa 标准

标签 java jpa spring-data-jpa

我正在尝试查找具有所有已传递角色的所有用户,如下所示:

List<Mitarbeiter> findByRoles(Set<MitarbeiterRolle> roles) {

    EntityManager em = getEntityManager();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Mitarbeiter> cq = cb.createQuery(Mitarbeiter.class);
    Root<Mitarbeiter> mitarbeiter = cq.from(Mitarbeiter.class);

    List<Predicate> predicates = new ArrayList<>();
    for (MitarbeiterRolle role : roles) {
        Expression<MitarbeiterRolle> literal = cb.literal(role);
        predicates.add(literal.in(mitarbeiter.get("roles")));
    }
    cq.where(predicates.toArray(new Predicate[predicates.size()]));

    TypedQuery<Mitarbeiter> query = em.createQuery(cq);
    return query.getResultList();
}

但这会生成一些奇怪的sql

from
    mitarbeiter mitarbeite0_ cross 
join
    mitarbeiter_roles roles1_ cross 
join
    mitarbeiter_roles roles2_ 
where
    mitarbeite0_.id=roles1_.mitarbeiter_id 
    and mitarbeite0_.id=roles2_.mitarbeiter_id 
    and (
        ? in (
            .
        )
    ) 
    and (
        ? in (
            .
        )
    )
2020-03-13 09:37:19 - WARN  - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 0, SQLState: 42601
2020-03-13 09:37:19 - ERROR - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - FEHLER: Syntaxfehler bei ».«

知道如何实现这一目标吗?

最佳答案

cb.isMember 成功了

default List<Mitarbeiter> findByRoles(Set<MitarbeiterRolle> roles) {

    EntityManager em = getEntityManager();
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Mitarbeiter> cq = cb.createQuery(Mitarbeiter.class);
    Root<Mitarbeiter> mitarbeiter = cq.from(Mitarbeiter.class);

    List<Predicate> predicates = new ArrayList<>();
    for (MitarbeiterRolle role : roles) {
        predicates.add(cb.isMember(role, mitarbeiter.get("roles")));
    }
    cq.where(predicates.toArray(new Predicate[predicates.size()]));

    TypedQuery<Mitarbeiter> query = em.createQuery(cq);
    return query.getResultList();
}

关于java - 查找具有多个角色的用户作为 jpa 标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60667284/

相关文章:

java - 自动设置反向引用

java - Spring 数据 REST : sort parameter is ignored

java - 使用 NatTable 实现树

java - 字符串分割方法不会返回两个字符串

java - javax.persistence @Column 上的长度字段是否定义了最大值?

java - 使用 Spring JPA 存储库进行不同计数

java - spring data jpa中的store是什么?

java - Spring 共享全局状态的方式?

java - 我有驱动程序,class.forname() 不会抛出异常,但会抛出 'No Suitable Driver for MySQL '

java - 实体 JPA 中的 session 范围属性